jdk动态代理源码底层 java 的三种代理模式 jdk动态代理与cglib优势劣势以及jdk动态代理为什么要interface

在前两篇文章中

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);
    }

}

猜你喜欢

转载自www.cnblogs.com/silyvin/p/12032768.html