0

ここには明らかな何かが欠けていますが、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()

結果:

[]
4

1 に答える 1

1

コメントで述べたようにgetDeclaredMethods、クラスによって明示的に宣言されたメソッドのみを返します。メソッドをオーバーライドしないため、そのようなメソッドはありません。

すべてのメソッドのオーバーライドを追加すると、それらが再び表示されます (非最終的なもの)。

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

または、リフレクション API を使用すると、すべてのパブリック仮想メソッドgetMethods()を見つけることができます。

于 2016-07-28T15:11:19.477 に答える