就用设计模式中的概念引入一个Demo吧,Demo的作用主要是要了解代理的使用方法和需要使用的类及接口。
1.Subject接口
public interface Subject {
public void request();
}
2.RealSubject实现(委托类)
public class RealSubject implements Subject{
@Override
public void request() {
System.out.println("call method1");
}
}
3.自定义的实现InvocationHandler的MyInvalcationHandler<T>
public class MyInvalcationHandler<T> implements InvocationHandler {
T target;
public MyInvalcationHandler(T target) {
this.target = target;
}
@Override
public Object invoke(Object arg0, Method arg1, Object[] arg2) throws Throwable {
System.out.println("call invoke start");
return arg1.invoke(target, arg2);
}
}
4.具体调用
public static void main(String[] args){
System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");
System.out.println("run");
Subject subject = new RealSubject();
InvocationHandler handler = new MyInvalcationHandler<Subject>(subject);
Subject p = (Subject)Proxy.newProxyInstance(Person.class.getClassLoader(),
new Class<?>[]{Subject.class}, handler);
p.request();
}
4.说明
生成的代理类传入了InvocationHandler ,在代理类调用request方法时,request方法会调用handler的invoke方法,invoke方法中可以嵌入自己想要嵌入的代码,同时通过传入的参数调用到委托类中request方法的具体实现。