首页 > 其他 > 详细

动态代理的一些问题。

时间:2016-06-11 21:31:41      阅读:228      评论:0      收藏:0      [点我收藏+]

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

动态代理的一些问题。

原文:http://www.cnblogs.com/hlhdidi/p/5575888.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!