Исключение недопустимого доступа при попытке доступа к attibrute из родительского класса посредством самоанализа - PullRequest
9 голосов
/ 13 августа 2010

Я сейчас играю с самоанализом и аннотациями в Java 1.5. Имеет родительский абстрактный класс AbstractClass . Унаследованные классы могут иметь атрибуты (типа ChildClass ) с аннотацией @ ChildAttribute .

Я хотел написать общий метод, который бы перечислял все @ 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"

Я подумал, что доступ к самоанализу не заботит модификаторы, и он может читать / писать даже частным пользователям. Кажется, что это не так.

Как я могу получить доступ к значениям этих атрибутов?

Заранее спасибо за помощь,

Рафаэль

Ответы [ 2 ]

22 голосов
/ 13 августа 2010

Добавьте field.setAccessible (true), прежде чем получите значение:

field.setAccessible(true);
result.add((ChildClass) field.get(this));
7 голосов
/ 13 августа 2010

Попробуйте field.setAccessible(true) перед вызовом field.get(this). По умолчанию модификаторы учитываются, но их можно отключить.

...