动态代理

java代理有jdk动态代理、cglib代理,这里只说下jdk动态代理,jdk动态代理主要使用的是java反射机制(既java.lang.reflect包),动态代理使用前提:必须有接口
 

1、动态代理的作用(运行时实现指定的接口)

动态代理就是在运行时生成一个类,这个类会实现你指定的一组接口,而这个类没有.java文件,是在运行时生成的。

2、动态代理的使用方法

Class[] cs = {MyInterface.class};
MyInterface mi = (MyInterface)Proxy.newProxyInstance(loader, cs, h);
mi是cs的实现类
 
动态代理:程序运行时,使用JDK提供工具类(Proxy),动态创建一个类,此类一般用于代理。
代理:你 -- 代理(增强) -- 厂商
代理类:目标类:被代理的
 
目标对象:被增强的对象
代理对象:需要目标对象,然后在目标对象上添加了增强后的对象!
目标方法:增强的内容
 
代理对象 = 目标对象 + 增强
 
Object proxyObj = Proxy.newProxyInstance(参数1,参数2,参数3);
参数1:ClassLoader,类加载器!把.class文件加载到内存,形成Class对象!当前类.class.getClassLoader();
参数2:Class[] interfaces ,代理类需要实现的所有接口(确定方法),被代理类实例.getClass().getInterfaces();
参数3:InvocationHandler, 请求处理类,代理类不具有任何功能,代理类的每一个方法执行时,调用处理类invoke方法。
代理对象的所有方法(个别不执行,getClass())都会调用InvocationHandler的invoke()方法。
voke(Object proxy ,Method ,Object[] args)
                  参数1:当前对象,即代理对象!在调用谁的方法!
                  参数2:当前被调用的方法(目标方法)
                  参数3:方法实际参数。
 
 

3、动态代理的用途

动态代理的用途与装饰模式很相似,就是为了对某个对象进行增强。所有使用装饰者模式的案例都可以使用动态代理来替换。
 

4、常见问题

(1)这个invoke()方法在什么时候被调用!
     在代理对象被创建时?错误的!
     在调用代理对象所实现接口中的方法时?正确的!
 
posted on 2019-08-05 14:31  天高任鸟飞,海阔任鱼游  阅读(83)  评论(0编辑  收藏  举报