在前两篇文章中
java 的三种代理模式
jdk动态代理与cglib优势劣势以及jdk动态代理为什么要interface
讨论了jdk的动态代理
本文从源码级别了解一下,在源代码的基础上,加上
System.setProperty("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");
在注解的本质(yet)中,我们也曾经这么干,将代理类弄出来
Proxy0.class
public final class $Proxy0 extends Proxy implements IUserDao { private static Method m1; private static Method m3; private static Method m2; private static Method m0; public $Proxy0(InvocationHandler var1) throws { super(var1); } public final boolean equals(Object var1) throws { try { return ((Boolean)super.h.invoke(this, m1, new Object[]{var1})).booleanValue(); } catch (RuntimeException | Error var3) { throw var3; } catch (Throwable var4) { throw new UndeclaredThrowableException(var4); } } public final void save() throws { try { super.h.invoke(this, m3, (Object[])null); } catch (RuntimeException | Error var2) { throw var2; } catch (Throwable var3) { throw new UndeclaredThrowableException(var3); } }
h:
public class ProxyFactory implements InvocationHandler { //维护一个目标对象 private Object target; public ProxyFactory(Object target){ this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object returnValue = method.invoke(target, args); return returnValue; } //给目标对象生成代理对象 public Object getProxyInstance(){ return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this); } }