2010-08-13 6 views
8

현재 Java 1.5에서 내성 검사 및 주석을 사용하고 있습니다. 부모 추상 클래스가 AbstractClass입니다. 상속 된 클래스는 사용자 정의 @ChildAttribute 주석이있는 속성 (유형 ChildClass)을 가질 수 있습니다.인트로 피싱 (Indrospection)에 의해 부모 클래스에서의 접근을 시도 할 때 불법적 인 접근 예외가 발생했습니다.

모두 @ChildAttribute 인스턴스의 속성을 나열하는 일반적인 방법을 작성하려고합니다.

여기 내 코드가 있습니다.

부모 클래스 :

: 나는 다음과 같은 오류가

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

:

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

} 

테스트 자체 속성

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

나는 인트로 스펙 션 액세스가 수정자를 신경 쓰지 않고 개인 멤버들조차도 읽고 쓸 수 있다고했다. 그건 그렇지 않다.

어떻게 이러한 속성 값에 액세스 할 수 있습니까? 당신의 도움에 미리

감사합니다,

라파엘

답변

19

당신이 값 도착하기 전에 (사실) field.setAccessible를 추가

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

가벼운 속도! 감사합니다. –

7

field.get(this)를 호출하기 전에 field.setAccessible(true)을 시도합니다. 기본적으로 수식어는 적용되지만 해제 할 수 있습니다.