[toc]
动态代理 Java动态代理类位于Java.lang.reflect包下,一般主要涉及到以下两个类: InvocationHandler:该接口中仅定义了一个invoke方法。 每一个动态代理类都必须要实现InvocationHandler这个接口,并且每个代理类的实例都关联到了一个handler,当通过代理对象调用一个方法的时候,这个方法的调用就会被转发为由InvocationHandler这个接口的 invoke 方法来进行调用。
1 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable;
第一个参数obj一般是指要代理的类,method是被代理的方法,args为该方法的参数数组。这个抽象方法在代理类中动态实现。
Proxy:该类的作用就是用来动态创建一个代理对象的类,其中主要包含以下方法:
1 2 3 4 5 6 7 //获得一个代理类,其中loader是类装载器,interfaces是真实类所拥有的全部接口的数组. public static Class<?> getProxyClass(ClassLoader loader, Class<?>... interfaces) throws IllegalArgumentException{…} //返回代理类的一个实例,返回后的代理类可以当作被代理类使用. public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) throws IllegalArgumentException{…}
loader: 一个ClassLoader对象,定义了由哪个ClassLoader对象来对生成的代理对象进行加载。 interfaces: 一个Interface对象的数组,表示的是要给需要代理的对象提供一组什么接口,如果提供了一组接口给它,那么这个代理对象就宣称实现了该接口(多态),这样就能调用这组接口中的方法了。 h: 一个InvocationHandler对象,表示的是当这个动态代理对象在调用方法的时候,会关联到哪一个InvocationHandler对象上。
Proxy.newProxyInstance (ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)做了以下几件事. (1)根据参数 loader 和 interfaces 调用 getProxyClass(loader, interfaces) 创建代理类$Proxy0. $Proxy0类实现了interfaces的接口,并继承了Proxy类. (2)实例化 $Proxy0 并在构造方法中把loader传过去, 接着 $Proxy0 调用父类Proxy的构造器,为h赋值。接着把得到的 $Proxy0 实例强制转换成代理类. 当执行代理类的方法时,就调用了 $Proxy0 类中的方法.在执行代理类方法中,调用父类Proxy中的h的invoke()方法.即InvocationHandler.invoke()。