1.有个抽象对象(可以是接口可以是抽象类)
public interface Subject {
public void request();
public void test();
}
2.有个真实对象实现抽象对象类
public class RealSubject implements Subject{
@Override
public void request() {
System.out.println("From real subject");
}
@Override
public void test() {
System.out.println("test");
}
}
3.有个动态代理类实现InvocationHandler接口,实现invoke方法
public class DynamicSubject implements InvocationHandler{
private Object sub;
public DynamicSubject(Object obj){
this.sub = obj;
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("before calling:" +method);
method.invoke(sub, args);
System.out.println("after calling:" +method);
return null;
}
}
4.客户端调用采用newProxyInstance产生抽象类对象
/**
* 该代理类的内部属性是Object类型,实际使用的时候通过该类的构造方法传递进来一个对象
* 此外,该类还是先了invoke方法,该方法中的method.invoke其实就是调用被代理对象的将要
* 执行的方法,方法参数是sub,表示该方法从属于sub,通过动态代理类,我们可以执行真实对象
* 的方法前后加入自己一些额外的方法
*/
public class Client {
public static void main(String[] args) {
RealSubject realSubject = new RealSubject();
InvocationHandler handler = new DynamicSubject(realSubject);
Class<?> classType = handler.getClass();
//下面的代码一次性生成代理
Subject subject = (Subject) Proxy.newProxyInstance(classType.getClassLoader(), realSubject.getClass().getInterfaces(), handler);
//代理执行的方法
subject.request();
}
}