对于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
时间: 2024-12-25 04:21:17