1

これは、Java が内部でどのようにリフレクションを行うかについての質問です。

私は抽象クラスに言う

SuperClass

SuperClass からの 2 つの子クラス、

ChildClass1ChildClass2

SuperClassgetValue()属性値を定義していませんが、アクセサメソッドを定義しています。

ChildClass1メソッドをChildClass2オーバーライドし、両方ともメソッドにアノテーションをgetValue()追加し、実行時に保持されます(これはアノテーションです)。@MyAnnotation@MyAnnotationOneToOne

私のプログラムには、 のインスタンスChildClas1と のインスタンスがありますChildClass2。リフレクションを使用して、両方のオブジェクトからすべてのメソッドを取得しました。

予想どおりgetValue()、結果の配列に 2 つのメソッドが含まれています (1 つは 用、SuperClassもう 1 つは 用ChildClass)。

ChildClass1アクセサーとしてマークされたgetValue()メソッドのインスタンスの場合@MyAnnotation(methodAccessor プロパティ != null)、ChildClass2アクセサーとしてマークされたメソッドのインスタンスの場合は、注釈がありませんでした (getValue()親クラスのメソッドでした)。

理由がわかりませんでしたが、最終的にメソッドが宣言された順序を変更しましたChildClass2(アクセサーだけでなく、より多くのメソッドがありました)。つまり、すべてのゲッターとセッターを物乞いに置きChildClass2ChildClass1.

私の質問は、Java がメソッドをリフレクションのアクセサとしてどのように修飾するか、さらにメソッドが宣言される順序によってリフレクションの動作が変わるかどうかです。

4

2 に答える 2

2

Java はどのようにメソッドをリフレクションのアクセサとして修飾するか、

JavaBean は Reflections ライブラリが認識していない規約です。Beans Introspector を使用すると、getter と setter について、引数の名前と数によって仮定が行われます。

さらに、メソッドが宣言される順序は、リフレクションの動作を変更しますか?

メソッドが定義される順序は、 getMethods() などのように取得される順序になる傾向がありますが、この動作に依存することはできません。

于 2012-06-27T09:39:34.793 に答える
0

Java リフレクションは、アクセサー メソッドを他のものと区別しません。すべてが単なるメソッドです。メソッドが宣言される順序は重要ではありません。

于 2012-06-27T09:39:32.333 に答える