查看jdk動態代理類的內容

如果要看動態代理請轉移陣地:https://blog.csdn.net/qq_41861259/article/details/103096437
如果要看動態代理請轉移陣地:https://blog.csdn.net/qq_41861259/article/details/103049293
在看jdk動態代理源碼的時候就一直想看到生成的代理類是什麼樣子的,所以我就查了一些方法,在這裏分享給也有需要的人

//在運行的方法中要配置這個屬性
System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");
//將生成的代理類寫入文件,名字就是¥Proxy0,那後filePath自己隨便
 byte[] classFile = ProxyGenerator.generateProxyClass("$Proxy0",RealSubject.class.getInterfaces());
            out = new FileOutputStream(filePath[0]+"$Proxy0.class");
            out.write(classFile);

然後我給大家看下我生成的代理類的樣子,我的代理類是代理了Subject,Toos兩個接口,然後代理類自動繼承了Proxy,這也是爲什麼jdk的動態代理只能進行接口代理,因爲java是單繼承的,繼承了Proxy就不能繼承別的了,實現類就不行了,然後就是一些持有代理接口的所有方法對象,通過反射初始化了這些方法

public final class $Proxy0 extends Proxy implements Subject, Tools {
    private static Method m1;
    private static Method m4;
    private static Method m2;
    private static Method m5;
    private static Method m3;
    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});
        } catch (RuntimeException | Error var3) {
            throw var3;
        } catch (Throwable var4) {
            throw new UndeclaredThrowableException(var4);
        }
    }

    public final void rent() throws  {
        try {
            super.h.invoke(this, m4, (Object[])null);
        } catch (RuntimeException | Error var2) {
            throw var2;
        } catch (Throwable var3) {
            throw new UndeclaredThrowableException(var3);
        }
    }

    public final String toString() throws  {
        try {
            return (String)super.h.invoke(this, m2, (Object[])null);
        } catch (RuntimeException | Error var2) {
            throw var2;
        } catch (Throwable var3) {
            throw new UndeclaredThrowableException(var3);
        }
    }

    public final void tools() throws  {
        try {
            super.h.invoke(this, m5, (Object[])null);
        } catch (RuntimeException | Error var2) {
            throw var2;
        } catch (Throwable var3) {
            throw new UndeclaredThrowableException(var3);
        }
    }

    public final void hello(String var1) throws  {
        try {
            super.h.invoke(this, m3, new Object[]{var1});
        } catch (RuntimeException | Error var3) {
            throw var3;
        } catch (Throwable var4) {
            throw new UndeclaredThrowableException(var4);
        }
    }

    public final int hashCode() throws  {
        try {
            return (Integer)super.h.invoke(this, m0, (Object[])null);
        } catch (RuntimeException | Error var2) {
            throw var2;
        } catch (Throwable var3) {
            throw new UndeclaredThrowableException(var3);
        }
    }

    static {
        try {
            m1 = Class.forName("java.lang.Object").getMethod("equals", Class.forName("java.lang.Object"));
            m4 = Class.forName("com.testproxy.dynamic.Subject").getMethod("rent");
            m2 = Class.forName("java.lang.Object").getMethod("toString");
            m5 = Class.forName("com.testproxy.dynamic.Tools").getMethod("tools");
            m3 = Class.forName("com.testproxy.dynamic.Subject").getMethod("hello", Class.forName("java.lang.String"));
            m0 = Class.forName("java.lang.Object").getMethod("hashCode");
        } catch (NoSuchMethodException var2) {
            throw new NoSuchMethodError(var2.getMessage());
        } catch (ClassNotFoundException var3) {
            throw new NoClassDefFoundError(var3.getMessage());
        }
    }
}




 

發佈了37 篇原創文章 · 獲贊 40 · 訪問量 2915
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章