2013-12-20 122 views
0

我有一堆傳感器,應該從超類繼承。Java反射:從超類的繼承類調用GetDeclaredFields()方法

在我的超類以及傳感器本身中,存在靜態的最終屬性和我的屬性的可能值範圍,它們定義了我的傳感器。

現在我想找出一個方法,該方法在超類中返回屬性及其值範圍的HashMap

由於事實上,傳感器永遠不會改變它的參數,我想用這個getAttributes()方法作爲一個類方法,可選地在我的main []中調用它。

我的問題是:如何以靜態方式獲得屬性(我此時使用了反射)如此好。我說的

UML圖:
Here

我的主要方法是這樣的:

public static void main(String[] args){ 
    HashMap<String, List<String>> a = SensorA.getConfigurationAttributes(); 
} 

和我的抽象組件類:

public static HashMap<String, List<String>> getConfigurationAttributes(boolean getMandatoryOnly){ 
    Field[] classAttributes = this.getClass().getDeclaredFields(); // error: cannot use this in static context 
    // ... other code, working with the attributes. 
} 

當然,現在, Java說:「不能在靜態上下文中使用它。」但是,我該如何糾正這個錯誤?

一方面,刪除靜態標籤將解決問題,另一方面,我必須在獲取我的屬性信息之前實例化每個傳感器。

回答

0

,如果你沿着您要檢索的字段作爲參數傳遞給你的方法的類傳給你可以做到這一點靜態。

否則,你只能爲你所在的班級做,因爲你已經知道所有聲明的領域,哪種打敗的目的。

靜態方法不是繼承的,所以你不能在子類上神奇地調用它(因爲你確實需要刪除static修飾符)。

因此,做這樣的事情,也許達到你想要什麼:

public static HashMap<String, List<String>> getConfigurationAttributes(boolean getMandatoryOnly, Class c) 
{ 
    Field[] classAttributes = c.getDeclaredFields(); 
    // ... other code, working with the attributes. 
} 

編輯:現在的強制性警告有關反射:使用反射像,這不是一個很好的或優雅的解決方案。反思代價昂貴,圍繞着許多語言特性工作,而不是一種非常乾淨的實現方式。儘可能避免反思,在大多數情況下,有簡單,優雅和簡單的解決方案。

0

您正在使用關鍵字「this」,它在靜態方法內引用該對象的實例。 這是不正確的。

爲了達到同樣的任務,使用此代碼來代替:

Field[] fields = Class.forName("my.package.MyClass").getDeclaredFields();