Я в настоящее время играю с самоанализом и аннотациями в 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
Добавьте field.setAccessible (true), прежде чем вы получите значение:
field.setAccessible(true);
result.add((ChildClass) field.get(this));
Попробуйте field.setAccessible (true)
перед вызов field.get (this)
. По умолчанию модификаторы учитываются, но их можно отключить.