先来看一下思维导图:
对于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