设计模式之动态代理(Java的JDK动态代理实现)

对于JDK的动态代理,孔浩老师说学习的方法是把它记下来。

先写一个主题接口类,表示要完成的一个主题。

package com.liwei.dynaproxy;
/**
 * 要代理的主题接口
 * @author Administrator
 *
 */
public interface Subject {
    public void miai();
}

再写一个实现类,这个实现类实现这个接口。当然,这个实现类就是我们要代理的对象。

为了区别不同的类的对象,我们为Person类增加了一个name属性,并且通过构造函数将name属性值“注入”,这里是初学者比较难理解的地方,其实多写几遍也就明白了。

package com.liwei.dynaproxy;

/**
 * 被代理的对象
 * 
 * @author Administrator
 * 
 */
public class Person implements Subject {
    private String name;

    public Person(String name) {
        super();
        this.name = name;
    }

    public void miai() {
        System.out.println(name + "正在相亲中。。。");
    }

}

接下来,写我们的动态代理类。

注意:动态代理类要实现JDK的InvocationHandler接口,实现invoke方法。

其中,成员变量Object target代表被代理的对象。同样地,也是通过动态代理类的构造函数注入进来。

强调:invoke方法的第1个参数Object proxy一般不使用。

package com.liwei.dynaproxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 * 动态代理类,这是一个处理器
 * 
 * @author Administrator
 * 
 */

public class DynaProxy implements InvocationHandler {
    private Object target; // 被代理对象

    public DynaProxy(Object target) {
        super();
        this.target = target;
    }

    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        Object object =null;
        System.out.println("前置通知。。。");
        object = method.invoke(target, args);
        System.out.println("返回通知。。。");
        return object;
    }

    
}

最后,我们写一个测试类。

package com.liwei.dynaproxy;

import java.lang.reflect.Proxy;

public class Test {
    public static void main(String[] args) {
        Person p = new Person("彭丽媛");
        DynaProxy dynaProxy = new DynaProxy(p);
        // Proxy 提供用于创建动态代理类和实例的静态方法,它还是由这些方法创建的所有动态代理类的超类。
        // 动态生成代理对象(类加载器,被代理接口,InvocationHandler)
        Subject s=(Subject)Proxy.newProxyInstance(p.getClass().getClassLoader(), p.getClass()
                .getInterfaces(), dynaProxy);
        s.miai();
    }
}

 源代码:JDK的动态代理源代码.rar

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。