我在这里遗漏了一些明显的东西,但是当我使用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()
结果:
[]
答案 0 :(得分:1)
如评论中所述,getDeclaredMethods
仅返回类显式声明的方法。由于您没有覆盖任何方法,因此没有这样的方法。
如果您为所有方法添加了覆盖,您将再次看到它们(非最终方法):
new ByteBuddy().subclass(Object.class)
.method(any()).intercept(SuperMethodCall.INSTANCE)
.make()
.load(getClass().getClassLoader())
.getLoaded()
.getDeclaredMethods()
或者,反射API提供getMethods()
来查找所有公共虚拟方法。