动态代理的一些问题。
Posted 大胡龙的小圈子
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态代理的一些问题。相关的知识,希望对你有一定的参考价值。
在学习动态代理的过程中,发现动态代理代理的类必须需要实现一个接口,此外,处理器中的invoke方法,在对代理产生的对象调用任何方法的时候,均会执行,但是method代表的是“对应与在代理实例上调用的接口的方法的Method实例”,因此Method对象调用,仅在调用接口方法的情况下,有结果,对于以下示例代码:
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class Demo3 { public static void main(String[] args) { Dog dd=new Dog(); MyHandler mh=new MyHandler(dd); Object pro=Proxy.newProxyInstance(dd.getClass().getClassLoader(),dd.getClass().getInterfaces(), mh); System.out.println(pro); Animal an=(Animal)pro; an.eat(); } } class MyHandler implements InvocationHandler { private Object target; public MyHandler(Object target) { super(); this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//这个方法在每调用一次方法的时候都会执行 System.out.println("------代理中-------"); method.invoke(target, args); //这个方法只有在调用的是接口的方法的时候才会执行 System.out.println("-----代理完成-------"); return null ; } } interface Animal { public void eat(); public void work(); } class Dog implements Animal { @Override public void eat() { System.out.println("狗在吃东西"); } @Override public void work() { System.out.println("狗在走"); } }
输出结果为:
------代理中------- -----代理完成------- null ------代理中------- 狗在吃东西 -----代理完成-------
这是因为在调用System.out.println方法的时候实际调用了代理对象的toString方法,因此invoke方法返回了空,并被打印了出来。
以上是关于动态代理的一些问题。的主要内容,如果未能解决你的问题,请参考以下文章