2012-06-27 62 views
1

這是一個關於Java如何在內部進行反射的問題。訪問器方法和Java反射

我有一個抽象類,說

SuperClass 

,並從父類2類子女學費,

ChildClass1ChildClass2

SuperClass定義了訪問方法getValue(),儘管它沒有定義屬性值。

ChildClass1ChildClass2覆蓋的方法和getValue()既註釋@MyAnnotation添加到方法,@MyAnnotation被保持在運行時(這是OneToOne註釋)。

在我的程序中,我有一個ChildClas1的實例和ChildClass2的實例。我使用反射從兩個對象中獲取所有方法。

正如所料,我在結果數組中得到了兩個getValue()方法(一個用於SuperClass,另一個用於ChildClass)。

對於ChildClass1getValue()方法有@MyAnnotation被標記爲訪問的實例(methodAccessor財產!= NULL)但對於ChildClass2實例方法標記爲訪問沒有註釋(是的getValue()方法父類)。

我不明白爲什麼,最終我改變了方法是在ChildClass2聲明的順序(有不僅僅是存取更多的方法),也就是我把所有getter和setter在begginging和ChildClass2被表現爲ChildClass1

我的問題是,Java如何將方法限定爲反射中的訪問器,並且進一步按照聲明方法的順序改變反射行爲?

+3

後兩句話,我失去了蹤跡,你可以把一個簡單的例子一起傳達你想要達到的目的,你的問題太長以至於不能... – Nim

+0

你可以擦亮和重新格式化你的問題,併發布你的實際的代碼,請嗎? – carlspring

回答

0

Java反射不區分存取方法和其他方法 - 所有這些都只是方法。方法聲明的順序無關緊要。

2

怎樣的Java方法有資格作爲反射存取,

它不JavaBean是一種convension該思考圖書館是不知道的。如果你使用Beans Introspector,它可以通過名字和數字參數對getter和setter進行假設。

並且進一步聲明方法的順序是否改變了反射行爲?

方法定義的順序往往是它們被檢索的順序,例如, getMethods(),但不能依賴此行爲。

+1

我相信'getMethods()'返回的方法的順序在JDK版本之間實際上是_changed_。 –

+0

,即使對於最新版本的Hotspot/OpenJDK也是如此,對於其他實現可能並非如此。 –