簡體   English   中英

使用ByteBuddy對類進行子類化將導致沒有任何已聲明方法的類

[英]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僅返回由類顯式聲明的方法。 由於您不覆蓋任何方法,因此此類方法為零。

如果為所有方法添加了替代,則您將再次看到它們(非最終方法):

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM