反射中的动态代理

我理解的动态代理就是,被代理类是不确定的,所以这是需要一个代理器,把需要代理的类,就是被代理类放入到代理器中,我们需要的一些重复操作让代理器帮我们做就可以了。就比如我们买房子的时候,我们需要中介,这个中介就是一个代理类,我们就是被代理类。但是有好多好多中介,这是我们就是所有的中介何为一个代理中介,就是一个代理器,我们把我么你想要做的事全部放到代理器中,一些所有的重复操作就不用再做了。所以在动态代理中我们需要代理器、被代理类这两个类。下面简单的实现了动态代理的代码。

package com.an.test.proxy;

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

public class TestDynamicProxy {
	public static void main(String[] args) {
		//1.被代理类的对象
		RealSubject real = new RealSubject();
		//2.创建了一个实现了InvocationHandler接口的类的对象,处理器
		MyInvocationHandler handler = new MyInvocationHandler();
//		调用blind()方法,动态的返回一个同样实现了real所在类实现的接口
//		Subject的代理类的对象
		Object obj = handler.blind(real);
		Subject sub = (Subject) obj;
		sub.action();
	
		
	}
}

interface Subject{
	public void action();
}

class RealSubject implements Subject{
	@Override
	public void action() {
		System.out.println("我是被代理类....");
	}
}

//处理器
class MyInvocationHandler implements InvocationHandler{

	Object obj;//实现了接口的被代理类的对象的声明
	
	//①给被代理类的对象实例化
	//②返回一个代理类的对象
	//绑定被代理类的对象
	public Object blind(Object obj){
		this.obj = obj;
		//第一个参数为被代理类 加载器
		//第二个参数是被代理类所实现的接口
		//第三个参数是被对象.处理器
		return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);
	}
	
	//当通过代理类的对象发起对被重写的方法的调用时,都会转换为对如下invoke方法的调用
	//invoke是JVM调用的
	//这里的method就是被代理类的方法,args就是被代理类的方法的参数
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		System.out.println("start");
		Object returnVal = method.invoke(obj, args);//这里的方法和方法的参数是动态的,所以体现出动态代理的思想
		System.out.println("end");
		return returnVal;
	}
	
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值