2014-12-02 34 views
0

我對Java編程比較陌生。我需要使用反射來獲取字段值。我當前的代碼如下所示(其中超是一組擴展MySuperClass類):獲取字段值而無需使用超類的導入?

for (Class<? extends MySuperClass> s : subclasses) { 
    try { 
     field = s.getDeclaredField("MY_FIELD"); 
     fieldValue = (String) field.get(null); 
    } catch ... 

我的問題是,每當我打電話field.get,我得到一個錯誤,因爲該類org.slf4j.LoggerFactory沒有被發現。這是從哪裏來的?那麼,MySuperClass進口它。我不知道爲什麼Java認爲有必要擁有它,因爲我想從中獲取MY_FIELD值的類不會導入它。當然,他們延伸MySuperClass(如果有關係,這是抽象的)。那麼有什麼辦法可以從只有從特定的類獲取字段值,而不依賴於超類使用的類?我不需要實例化一個類或其他東西,只需要得到那個值...

我希望我能夠解釋我的問題在哪裏,並且爲我的小Java知識而道歉。

非常感謝提前。

+2

'import'語句不會做你認爲它的作用。它實際上並不包含任何東西。如果你得到一個'ClassNotFoundException',那麼你已經加載/初始化的一些類需要它,而不是因爲'import',而是因爲它實際上使用了它。 – 2014-12-02 15:23:06

+1

堆棧跟蹤和可重現的示例在這裏會有所幫助。 – 2014-12-02 15:27:32

回答

2

每類依賴

  • 在它的所有超,並在其上的任何人都依賴;
  • 在它實現的所有接口上,以及它們所依賴的所有接口上;對所有表示其類,實例或局部變量,其方法的參數類型或其方法的返回類型的類和接口的所有類和接口,和
  • 上的所有類和接口,表示任何上述類型的類型參數邊界。

爲了檢查類的靜態變量,調用其靜態方法或實例化它,必須首先加載該類。爲了加載一個類,它的所有依賴關係也必須被加載。

反射的使用沒有解決上述問題,所以基本答案是否定的,沒有辦法在不加載超類的依賴關係的情況下讀取類的靜態變量的值。