JDK动态代理
通过一番学习,对动态代理有了一些初步的认识,动态代理就是说可以在运行期创建接口的代理实例。通过动态代理来实现AOP编程.
java动态代理主要涉及到java.lang.reflect包中的两个类:Proxy和InvocationHandler。
其中InvocationHandler是代理实例的调用处理程序 实现的接口。该接口中只有
Object invoke(Object proxy, Method method, Object[] args) 方法,该方法 在代理实例上处理方法调用并返回结果。
-
每个代理实例都具有一个关联的调用处理程序。对代理实例调用方法时,将对方法调用进行编码并将其指派到它的调用处理程序的
invoke
方法。
三个参数的意思是:
Object proxy 在其上调用方法的代理实例
Method method 对应于在代理实例上调用的接口方法的Method
实例
Object[] args 包含传入代理实例上方法调用的参数值的对象数组,如果接口方法不使用参数,则为null
返回:
从代理实例的方法调用返回的值。如果接口方法的声明返回类型是基本类型,则此方法返回的值一定是相应基本包装对象类的实例;否则,它一定是可分配到声明返回类型的类型。如果此方法返回的值为null
并且接口方法的返回类型是基本类型,则代理实例上的方法调用将抛出NullPointerException
。否则,如果此方法返回的值与上述接口方法的声明返回类型不兼容,则代理实例上的方法调用将抛出ClassCastException
。
如何创建代理实例呢?
方法一.1,通过Proxy.getProxyClass()方法创建若干接口的Class文件,
2,通过Class文件可以得到其构造方法
3,最后通过构造方法实例的newInstance方法得到代理实例
方法二.,通过Proxy的newProxyInstance() 方法,直接返回一个带有代理类的指定调用处理程序的代理实例,
它由指定的类加载器定义,并实现指定的接口
该方法的参数列表是:
ClassLoader loader, 指定一个类加载器用于加载指定的接口
Class<?>[] interfaces, 给出需要创建代理实例的接口
InvocationHandler h, 给出代理实例的调用处理程序实现的接口
---------------------- android培训、java培训、期待与您交流! ----------------------详细请查看:http://edu.youkuaiyun.com/heima