2010-08-13 3 views
8

Ich spiele gerade mit Introspektion und Anmerkungen in Java 1.5. Die Eltern haben eine abstrakte Klasse AbstractClass. Die geerbten Klassen können Attribute (vom Typ ChildClass) haben, die mit einer benutzerdefinierten @ChildAttribute Annotation versehen sind.Ungültige Zugriffsausnahme beim Zugriff auf attibrute von der Elternklasse durch Introspektion

Ich wollte eine generische Methode schreiben, die alle @ChildAttribute Attribute einer Instanz auflisten würde.

Hier ist mein Code so weit.

Die Elternklasse:

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; 
    } 
} 

Eine Testimplementierung, mit einigen Kind Attribute

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"; 

} 

Der Test selbst:

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

ich die folgende Fehlermeldung erhalten:

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

Ich dachte, dass Introspektion Zugriff nicht Modifikatoren interessiert, und konnte sogar private Mitglieder lesen/schreiben. Es scheint, dass es nicht der Fall ist.

Wie kann ich auf die Werte dieser Attribute zugreifen?

Vielen Dank im Voraus für Ihre Hilfe,

Raphael

Antwort

19

hinzufügen field.setAccessible (true), bevor Sie den Wert erhalten:

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

Lichtgeschwindigkeit! Danke! –

7

field.setAccessible(true) Versuchen vor field.get(this) aufrufen. Standardmäßig werden Modifikatoren berücksichtigt, die jedoch deaktiviert werden können.

Verwandte Themen