2013-06-01 2 views
0

회원에게 Subclass의 주소로 SuperClass에 액세스 할 수 있습니까? 이 공통 protected 멤버 액세스의 반대 방향이 될 것이라고수퍼 클래스의 하위 클래스에서 보호 된 필드에 액세스 하시겠습니까?

private void accessFields() { 
    Field[] fields = this.getClass().getDeclaredFields(); 
    for(Field field : fields) { 
     if(Modifier.isProtected(field.getModifiers()) { 
      //Will this always work? Or will get(this) throw an IllegalAccessException? 
      Object value = field.get(this); 
     } 
    } 
} 

참고하지 SubClassprotected 멤버에 액세스하지만, SuperClass.

+1

수퍼 클래스는 하위 클래스에 대한 지식이나 종속성을 가져서는 안되기 때문에 역으로 보입니다. 왜 이걸 고려하고 싶니? 내 조언은이 미친 요구 사항이 필요하지 않도록 코드를 다시 디자인하는 것입니다. –

+0

물론, 당신은 모든 종류의 미친 것들을 반영 할 수 있습니다. 발에 총을 대고 방아쇠를 당기십시오. 코드를 작성했습니다. * 시도해보십시오 *! –

+0

이유는 하위 클래스 필드에 주석을 달아서 수퍼 클래스의 주석 필드와 작업 할 수 있기를 원합니다. (즉, DB에 어떤 필드를 저장해야합니까?) 나쁜 디자인? 좋아요, 다시 생각해 볼게요, 고마워요! – SeriousBob

답변

1

리플렉션을 사용하여 개체의 모든 필드 (개인, 보호됨, 공개)에 액세스 할 수 있습니다. 객체의 비공개 필드에 액세스하는 클래스가 수퍼 클래스 또는 하위 클래스 (리플렉션 사용시)인지 여부는 중요하지 않습니다.

PrivateObject privateObject = new PrivateObject("The Private Value"); 

Field privateStringField = PrivateObject.class. 
     getDeclaredField("privateString"); 

privateStringField.setAccessible(true); 

String fieldValue = (String) privateStringField.get(privateObject); 
System.out.println("fieldValue = " + fieldValue); 

는만큼 당신이 PrivateObject 클래스의 객체를 얻을 수 있습니다, 당신은 필드에 액세스 할 수 있습니다. 비공개 입력란에 액세스하려면 field.setAccessible(true)을 기억하십시오.

+0

감사합니다. 가능하면 질문에 대답합니다. – SeriousBob

1

리플렉션을 통해 모든 작업을 수행 할 수 있습니다. JVM의 메모리를 직접 조작 할 수도 있습니다 (sun.misc.Unsafe).

그러나 일반적으로 액세스 할 수없는 경우 setAccessible 또는 그 유사 물을 사용해야합니다.