これは、Java が内部でどのようにリフレクションを行うかについての質問です。
私は抽象クラスに言う
SuperClass
SuperClass からの 2 つの子クラス、
ChildClass1
とChildClass2
。
SuperClass
getValue()
属性値を定義していませんが、アクセサメソッドを定義しています。
ChildClass1
メソッドをChildClass2
オーバーライドし、両方ともメソッドにアノテーションをgetValue()
追加し、実行時に保持されます(これはアノテーションです)。@MyAnnotation
@MyAnnotation
OneToOne
私のプログラムには、 のインスタンスChildClas1
と のインスタンスがありますChildClass2
。リフレクションを使用して、両方のオブジェクトからすべてのメソッドを取得しました。
予想どおりgetValue()
、結果の配列に 2 つのメソッドが含まれています (1 つは 用、SuperClass
もう 1 つは 用ChildClass
)。
ChildClass1
アクセサーとしてマークされたgetValue()
メソッドのインスタンスの場合@MyAnnotation
(methodAccessor プロパティ != null)、ChildClass2
アクセサーとしてマークされたメソッドのインスタンスの場合は、注釈がありませんでした (getValue()
親クラスのメソッドでした)。
理由がわかりませんでしたが、最終的にメソッドが宣言された順序を変更しましたChildClass2
(アクセサーだけでなく、より多くのメソッドがありました)。つまり、すべてのゲッターとセッターを物乞いに置きChildClass2
、ChildClass1
.
私の質問は、Java がメソッドをリフレクションのアクセサとしてどのように修飾するか、さらにメソッドが宣言される順序によってリフレクションの動作が変わるかどうかです。