动态代理

来源:互联网 发布:股票雷达 知乎 编辑:程序博客网 时间:2024/06/05 04:35
代理模式:设计模式的一种,引用<大话设计模式>一书的一句话,“代理模式其实就是在访问对象时引入一定程度的间接性,因为这种间接性,可以附加多种用途”。

详细代码:

public interface BookDAO {    void addBook();}public class BookDAOImpl implements BookDAO {    public void addBook() {        System.out.println("添加一本书");    }}//关于动态代理有一个proxy类和一个InvocationHandler接口//实现动态代理主要的两部分,proxy的newProxyInstance方法和InvocationHandler的invoke方法/** * 动态代理实现类 */public class BookDAOProxy implements InvocationHandler {    private Object obj;    public BookDAOProxy( ){ }    public BookDAOProxy( Object obj ){ this.obj = objImpl; }    /**     * buildProxy根据参数传过来的接口实现类对象(被代理对象),     * 调用proxy类的newProxyInstance方法生成一个代理对象     * @param objImpl     * @return     */    public Object buildProxy(Object objImpl) {        this.obj = objImpl;//这里根据反射得到objImpl的类加载器,objImpl的接口数组,还需要InvocationHandler接口的子类实例         return Proxy.newProxyInstance(objImpl.getClass().getClassLoader(), objImpl.getClass().getInterfaces(), this);    }//invoke方法顾名思义就是调用的意思,三个参数(代理对象,方法,方法参数)实际实现这个方法时候只需要后两个参数就够了    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {        Object result = null;        System.out.println("图书添加开始之前的方法");        result = method.invoke(obj, null);//注意:这里的obj可不是newProxyInstance方法返回的代理对象        System.out.println("图书添加开始之后的方法");        return result;    }}//test public static void main(String[] args) {        //实例一个动态代理类对象        BookDAOProxy bookDAOProxy = new BookDAOProxy();        //调用动态代理实现类的buildProxy方法,        BookDAO proxy = (BookDAO) bookDAOProxy.buildProxy(new BookDAOImpl());        proxy.addBook();    }//输出结果:图示添加开始之前的方法添加一本书图示添加开始之后的方法



问题来了,invoke方法并没有用到代理对象,method.invoke(obj,null)用的只是bookDAOImpl的实例

为什么代理对象会执行invoke方法;

原因就是在执行Proxy.newProxyInstance方法的时候,返回的代理对象继承了Proxy,又把接口赋给了Proxy

在代理对象执行invocationHandlerinvoke方法时有一句代码super.h.invoke

由于水平有限,源码并没全看懂所以只能这么理解了。。

还有一个问题就是invocationHandlerinvoke方法参数列表的第一个参数proxy(也就是代理对象)一直没用到

某个大神的博客解释就是:留给实现者用proxy代理对象通过反射搞事情用的,




0 0
原创粉丝点击