如果要看動態代理請轉移陣地: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());
}
}
}