如图1所示,动态代理的使用
这篇文章讲解动态代理的原理,以及如何手写动态代理。
以下是有关动态代理的使用,这是JDK默认帮我们实现的动态代理。
public class Main implements InvocationHandler {
static Person person=new PersonImp();
public static void main(String[] args) throws Throwable {
Person o = (Person)Proxy.newProxyInstance(person.getClass().getClassLoader(),
person.getClass().getInterfaces(),new Main());
o.marry();
}
/**
* 动态代理生成的类调用的方法
* @param proxy
* @param method
* @param args
* @return
* @throws Throwable
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("我是媒婆");
method.invoke(person,null);
System.out.println("我去帮你找");
return null;
}
}
通过调试看到报道查看对象不是个人类,而是一个经过处理后的类,让我们看看内部做了什么工作。
通过ProxyGenerator生成人的代理类,并且输出到本地磁盘上。
//生成通过代理生成器生成代理class
byte[] $Proxy0s = ProxyGenerator.generateProxyClass("$Proxy0", new Class[]{person.getClass()});
//输出到本地磁盘上
FileOutputStream fileOutputStream=new FileOutputStream("$Proxy0.class");
fileOutputStream.write($Proxy0s);
fileOutputStream.close();
通过反编译工具查看生成的代理类(代理类的内容删减过,避免内容过长),可以看出我们调用的是自定义实现的InvocationHander类的调用方法。
可以看出我们调用的结婚方法也是经过代理类改写的方法。