2010-08-13 34 views
8

我目前在Java 1.5中使用自省和註釋。 有一個父抽象類抽象類。 繼承的類可以具有用自定義@ChildAttribute批註註釋的屬性(類型爲ChildClass)。嘗試通過自檢從父類訪問attibrute時出現非法訪問異常

我想寫一個通用的方法,將列出一個實例的所有@ChildAttribute屬性。

這是我的代碼到目前爲止。

的父類:

public abstract class AbstractClass { 

    /** List child attributes (via introspection) */ 
    public final Collection<ChildrenClass> getChildren() { 

     // Init result 
     ArrayList<ChildrenClass> result = new ArrayList<ChildrenClass>(); 

     // Loop on fields of current instance 
     for (Field field : this.getClass().getDeclaredFields()) { 

      // Is it annotated with @ChildAttribute ? 
      if (field.getAnnotation(ChildAttribute.class) != null) { 
       result.add((ChildClass) field.get(this)); 
      } 

     } // End of loop on fields 

     return result; 
    } 
} 

的測試執行,一些孩子的屬性

public class TestClass extends AbstractClass { 

    @ChildAttribute protected ChildClass child1 = new ChildClass(); 
    @ChildAttribute protected ChildClass child2 = new ChildClass(); 
    @ChildAttribute protected ChildClass child3 = new ChildClass(); 

    protected String another_attribute = "foo"; 

} 

測試本身:

TestClass test = new TestClass(); 
test.getChildren() 

我收到以下錯誤:

IllegalAccessException: Class AbstractClass can not access a member of class TestClass with modifiers "protected" 

我認爲反省訪問不關心修飾符,甚至可以讀/寫私人members.It似乎並非如此。

如何訪問這些屬性的值?

預先感謝您的幫助,

拉斐爾

回答

19

添加field.setAccessible(真),你得到的前值:

field.setAccessible(true); 
result.add((ChildClass) field.get(this)); 
+0

光速! 謝謝! – 2010-08-13 13:12:26

7

調用field.get(this)之前嘗試field.setAccessible(true)。默認情況下,修飾符是榮幸的,但可以關閉。

相關問題