2016-07-27 27 views
0

我在這裏丟失了一些明顯的東西,但是當我使用ByteBuddy子類化一個類時,我看不到聲明的方法。使用ByteBuddy子類化一個類沒有任何聲明的方法

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() 

結果:

[] 
+2

閱讀[用於getDeclaredMethods()的Javadoc()](https://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#getDeclaredMethods()):「排除了繼承的方法」。 –

+0

現在有道理。謝謝@AndyTurner –

回答

1

正如評論所說,getDeclaredMethods僅返回是expli方法由班級宣佈。由於您不覆蓋任何方法,因此零方法。

如果添加了所有方法的重寫,你將再次(非最終的)看到他們:

new ByteBuddy().subclass(Object.class) 
    .method(any()).intercept(SuperMethodCall.INSTANCE) 
    .make() 
    .load(getClass().getClassLoader()) 
    .getLoaded() 
    .getDeclaredMethods() 

另外,反射API尋找所有公共虛擬方法提供getMethods()

相關問題