在读这篇文章之前请先阅读之前一篇http://10572970.blog.51cto.com/10562970/1759600,本篇的例子取自前篇。
首先实现动态代理需要JDK提供的一个接口(InvocationHandler)和一个类(Proxy)来支持。首先说一下 InvocationHandler这个接口,里面有一个public Object invoke(Object proxy, Method method, Object[] args)throws Throwable方法,作用代理类执行的方法的。也就是说代理类每次调用一个方法都会触发代理类所关联的InvocationHandler的invoke方法。其中invoke的参数说明:
Object proxy是指被代理的对象
Method method 代理调用的方法
Object[] args 表示方法参数
下面到了proxy类了,它提供了一些静态的方法来创建代理类。好了,看代码:
MyHandler<<span style="color:#20999d;">T> [object Object]InvocationHandler { ; MyHandler(iEms) { .= iEms; [object Object] } Object invoke(Object proxy, Method method, Object[] args) [object Object]Throwable { .getClass().getClassLoader(); [object Object] [object Object]System..println(); [object Object] [object Object]Object result = method.invoke(.,args); [object Object] [object Object]System..println(); result; } }
创建了一个Handler,使用了泛型,大概大伙都知道了,适应更多的类。
然后到了Proxy类了,为了更通用一些,我用一个类继承了Proxy
CommonProxy{ <> getProxy(t) { Class<?>[] clazz = t.getClass().getInterfaces(); ClassLoader classLoader = t.getClass().getClassLoader(); MyHandler handler = MyHandler(t); t = () Proxy.(classLoader,clazz,handler); t; } } getProxy就是为某个类创建一个代理类。采用泛型的作用就不用解释了。下面看看用法。 IEms jdEms = new JDEms(); IEms jdproxy = CommonProxy.getProxy(jdEms); jdproxy.deliver(); jdproxy.call(); jdproxy.getFood();
当然读者也可以自己创建一个接口和一个实现了该接口的类。然后被该类创建代理类。最后我们看看InvocationHandler的invoke的方法我们做了什么处理:
[object Object]System..println(); [object Object] [object Object]Object result = method.invoke(.,args); [object Object] [object Object]System..println();
相信使用过Spring的都不会陌生,对,就是前置通知和后置通知。这就是spring aop的基础。关于动态代理的Proxy类使用不大熟悉的,可以参考这篇博客:http://www.cnblogs.com/xiaoluo501395377/p/3383130.html
本文出自 “10562970” 博客,请务必保留此出处http://10572970.blog.51cto.com/10562970/1759602
原文地址:http://10572970.blog.51cto.com/10562970/1759602