动态代理属于设计模式中的代理模式,代理模式的定义为:为其它对象提供一种代理以控制对这个对象的访问控制;在某些情况下,客户不想或者不能直接引用另一个对象,这时候代理对象可以在客户端和目标对象之间起到中介的作用(百度百科)。动态代理则是在在程序运行时,通过反射机制动态生成代理对象。
核心方法:public static ObjectnewProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)。
第一个参数:用来加载接口类文件的ClassLoader;
第二个参数:需要被代理的接口数组,也可以通过默认实现对象去调用getClass().getInterfaces()获取;
第三个参数:处理实际代理逻辑的,每次调用被代理接口的方法时,都会执行public Objectinvoke(Object proxy, Method method, Object[] args)方法,若有默认的接口实现,可以通过调用public native Object invoke(Object obj, Object... args)执行接口默认实现。
代理创建过程大致如下:查找缓存中是否存在代理类的类对象,若不存在则创建代理类的类对象(详细见WeakCache中的get方法),获取代理类的类对象的构造函数,创建代理类实例对象。
如果目标对象没有实现接口,可以使用Cglib代理。
网友评论