使用 ByteBuddy 子 classing Class 导致 class 没有任何声明的方法
Subclassing a Class using ByteBuddy results in a class without any declared methods
我在这里遗漏了一些明显的东西,但是当我使用 ByteBuddy 对 Class 进行子类化时,我没有看到声明的方法。
Object.class.getDeclaredMethods()
结果:
[protected void java.lang.Object.finalize() throws java.lang.Throwable, public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException, public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException, public final void java.lang.Object.wait() throws java.lang.InterruptedException, public boolean java.lang.Object.equals(java.lang.Object), public java.lang.String java.lang.Object.toString(), public native int java.lang.Object.hashCode(), public final native java.lang.Class java.lang.Object.getClass(), protected native java.lang.Object java.lang.Object.clone() throws java.lang.CloneNotSupportedException, private static native void java.lang.Object.registerNatives(), public final native void java.lang.Object.notify(), public final native void java.lang.Object.notifyAll()]
现在使用 ByteBuddy:
new ByteBuddy().subclass(Object.class)
.make()
.load(getClass().getClassLoader(), ClassLoadingStrategy.Default.INJECTION)
.getLoaded().getDeclaredMethods()
结果:
[]
如评论中所述,getDeclaredMethods
仅 returns 由 class 显式声明的方法。由于您不覆盖任何方法,因此此类方法为零。
如果您为所有方法添加了覆盖,您会再次看到它们(非最终方法):
new ByteBuddy().subclass(Object.class)
.method(any()).intercept(SuperMethodCall.INSTANCE)
.make()
.load(getClass().getClassLoader())
.getLoaded()
.getDeclaredMethods()
或者,反射 API 提供 getMethods()
用于查找所有 public 虚拟方法。
我在这里遗漏了一些明显的东西,但是当我使用 ByteBuddy 对 Class 进行子类化时,我没有看到声明的方法。
Object.class.getDeclaredMethods()
结果:
[protected void java.lang.Object.finalize() throws java.lang.Throwable, public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException, public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException, public final void java.lang.Object.wait() throws java.lang.InterruptedException, public boolean java.lang.Object.equals(java.lang.Object), public java.lang.String java.lang.Object.toString(), public native int java.lang.Object.hashCode(), public final native java.lang.Class java.lang.Object.getClass(), protected native java.lang.Object java.lang.Object.clone() throws java.lang.CloneNotSupportedException, private static native void java.lang.Object.registerNatives(), public final native void java.lang.Object.notify(), public final native void java.lang.Object.notifyAll()]
现在使用 ByteBuddy:
new ByteBuddy().subclass(Object.class)
.make()
.load(getClass().getClassLoader(), ClassLoadingStrategy.Default.INJECTION)
.getLoaded().getDeclaredMethods()
结果:
[]
如评论中所述,getDeclaredMethods
仅 returns 由 class 显式声明的方法。由于您不覆盖任何方法,因此此类方法为零。
如果您为所有方法添加了覆盖,您会再次看到它们(非最终方法):
new ByteBuddy().subclass(Object.class)
.method(any()).intercept(SuperMethodCall.INSTANCE)
.make()
.load(getClass().getClassLoader())
.getLoaded()
.getDeclaredMethods()
或者,反射 API 提供 getMethods()
用于查找所有 public 虚拟方法。