JAVA设计模式——JDK动态代理

动态代理概念

动态代理的意义

动态代理的意义:生成一个代理对象,来代理真实对象,控制真实对象的访问。

代理模式简单解析

案例模板
如图所示:顾客通过前台点餐,而不直接向后厨点餐。前台代理后厨,能够完成出餐的需求。

  • 这里 前台代理后厨被代理
  • 后厨只需专注出餐的需求,无需关注收钱等业务需求。

代理的作用

代理的作用:在真实对象访问之前或者之后加入对应的逻辑,或者根据其他规则控制是否使用真实对象。

实现JDK动态代理

## 接口与实现类

1. 接口

Person.java

package edu.mju.proxy;

public interface Person {
	void run();
}

2. 实现类

Man.java

package edu.mju.proxy;

public class Man implements Person {

	@Override
	public void run() {
		System.out.println("Man的run()方法");
	}

}

## 代理逻辑类

JdkDynamicProxy.java

方法说明
Object proxyRelation(Object realObject)传入真实对象,建立代理对象和真实对象的代理关系,并返回代理对象
Object invoke(Object proxy, Method method, Object[] args)重写InvocationHandler接口中的invoke()方法.当我们使用了代理对象调度方法后,会进入invoke方法里面.
package edu.mju.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * JDK动态代理
 * 必须实现 InvocationHandler()接口
 */
public class JdkDynamicProxy implements InvocationHandler{

	//真实对象
	private Object realObject = null;


	/**
	 *  建立代理对象和真实对象的代理关系
	 * @param realObject 真实对象
	 * @return 代理对象
	 */
	public Object proxyRelation(Object realObject) {
		this.realObject = realObject;
		//newProxyInstance(类加载器, 生成代理对象挂在该接口下, 实现方法逻辑的代理类);
		return Proxy.newProxyInstance(realObject.getClass().getClassLoader(), 
				realObject.getClass().getInterfaces(), 
				this);
	}


	/**
	 *  实现代理逻辑方法
	 * @param proxy 代理对象
	 * @param method 调用的方法
	 * @param args 方法的参数
	 * @return
	 * @throws Throwable
	 */
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		System.out.println("---------------------进入代理invoke方法()---------------------");
		System.out.println("-------------------------调用真实对象方法之前------------------------");
		Object object = method.invoke(realObject, args);
		System.out.println("------------------------调用真实对象方法之后------------------------");
		return object;
	}
	
}

测试类

package edu.mju.proxy;

public class TestJdkProxy {

	public static void main(String[] args) {
		//创建代理方法
		JdkDynamicProxy jdkDynamicProxy = new JdkDynamicProxy();
		//声明代理对象Person proxy,调用proxyRelation():建立代理对象和真实对象的代理关系
		Person proxy = (Person)jdkDynamicProxy.proxyRelation(new Man());
		proxy.run();
	}

}

运行结果如下

---------------------进入代理invoke方法()---------------------
-------------------------调用真实对象方法之前------------------------
Man的run()方法
------------------------调用真实对象方法之后------------------------
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值