动态代理

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()方法在什么时候被调用!

     在代理对象被创建时?错误的!

     在调用代理对象所实现接口中的方法时?正确的!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章