动态代理的一些问题。

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方法返回了空,并被打印了出来。

以上是关于动态代理的一些问题。的主要内容,如果未能解决你的问题,请参考以下文章

JAVA之AOP

深入浅出JDK动态代理

设计模式之动态代理

静态代理和动态代理

Spring之静态/动态代理模式

动态 Rstudio 代码片段