Исключение несанкционированного доступа при попытке получить доступ к attibrute от родительского класса самоанализом

Я в настоящее время играю с самоанализом и аннотациями в 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"

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

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

Заранее спасибо за Вашу справку,

Raphael

9
задан Raphael Jolivet 13 August 2010 в 13:00
поделиться

2 ответа

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

field.setAccessible(true);
result.add((ChildClass) field.get(this));
22
ответ дан 4 December 2019 в 07:33
поделиться

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

7
ответ дан 4 December 2019 в 07:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: