JavaJDK动态代理模式的实现

JavaJDK动态代理模式的实现


  • 首先说一下JDK的实现原理
    1.拿到被代理对象的引用,然后获取他的接口
    2.JDK代理重新生成一个类,同时实现我们给的代理对象所实现的接口
    3.把被代理对象的引用拿到了
    4.重新动态生成一个class字节码
    5.然后编译
    然后实现一个动态代理,首先是实现java.lang.reflect.InvocationHandler接口,并使用java.lang.reflect.Proxy的静态方法newProxyInstance()方法生成代理对象
public class DymaicProxy implements InvocationHandler{
	public Object obj;//被代理的对象
	
	public DymaicProxy(Object obj){
		this.obj = obj;//接受客户
	}

	/**
	 * invoke():拿到想要被代理的对象
	 *   参数介绍:
	 *         第一个参数:被代理的真实对象
	 *         第二个参数:代表被动态代理类调用的方法。从中可得到方法名,参数类型,返回类型等等
	 *         第三个参数:代表被调用方法的参数
	 *  额外补充:因为是动态代理,所以可以实现一些特殊的功能,可以扩展增强其功能,
	 *  
	 */
		@Override
	public Object invoke(Object proxy, Method method, Object[] args)
				throws Throwable {
			
			Object result = method.invoke(this.obj, args);
		   
			return result;
		}

}

然后是实现类

public static void main(String[] args) {
		Customer  customer = new Customer();
        customer.setName("某某人");
		customer.setMoney(2000); //实例对象并赋值
		
		//Java反射之getInterfaces()方法:可以获取某一类对像所所实现的接口
		//System.out.println(customer.getClass().getInterfaces()[0]);
		
	   InvocationHandler  handler = new DymaicProxy(customer); //将对象传到上面写的类,他会自动执行invoke()方法并得到该对象的值
	   
	   
	   /*
        * 通过Proxy类的newProxyInstance()方法来创建我们的代理对象,我们来看看其三个参数
        * 第一个参数:类加载器,我们这里使用handler这个类的ClassLoader对象来加载我们的代理对象
        * 第二个参数:对象要实现哪些接口:我们这里为代理对象提供的接口是真实对象所实行的接口,表示我要代理的是该真实对象,这样我就能调用这组接口中的方法了
        * 第三个参数:它是一个接口!它的名字叫调用处理器,使用新建的proxy对象调用方法的时候,都会调用到该接口中的invoke方法。 我们这里将这个代理对象关联到了上方的 InvocationHandler 这个对象上
        */
		HomeZuLin home = (HomeZuLin) Proxy.newProxyInstance(handler.getClass().getClassLoader(), customer.getClass().getInterfaces(), handler);
		home.zuhome();
	}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值