2010-08-13 15 views
8

Actualmente estoy jugando con introspección y anotaciones en Java 1.5. Tienen una clase abstracta principal AbstractClass. Las clases heredadas pueden tener atributos (del tipo ChildClass) anotados con una anotación personalizada @ChildAttribute.Excepción de acceso ilegal al intentar acceder a attibrute desde la clase principal por introspección

Quería escribir un método genérico que enumerara todos los atributos @ChildAttribute de una instancia.

Aquí está mi código hasta ahora.

La clase padre:

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

Una aplicación de prueba, con un poco de niño atribuye

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

} 

La prueba en sí:

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

me sale el siguiente error:

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

Pensé que el acceso de introspección no se preocupaba por los modificadores, y podía leer/escribir incluso a los miembros privados. Parece que no es el caso.

¿Cómo puedo acceder a los valores de estos atributos?

Gracias de antemano por su ayuda,

Raphael

Respuesta

19

Añadir field.setAccessible (verdadero) antes de recibir el valor:

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

velocidad de la luz! Gracias! –

7

Trate field.setAccessible(true) antes de llamar field.get(this). Por defecto, los modificadores son respetados, pero se pueden desactivar.

Cuestiones relacionadas