动态代理的一些问题。

  在学习动态代理的过程中,发现动态代理代理的类必须需要实现一个接口,此外,处理器中的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方法返回了空,并被打印了出来。

posted @ 2016-06-11 20:40  hlhdidi  阅读(502)  评论(0编辑  收藏  举报