2009-10-12 5 views
77

Java에서 리플렉션을 통해 비공개 필드 str에 액세스 할 수 있습니까? 예를 들어이 필드의 값을 가져 오는 것입니다.Java에서 리플렉션을 통해 비공개 필드에 액세스 할 수 있습니까

class Test 
{ 
    private String str; 
    public void setStr(String value) 
    { 
     str = value; 
    } 
} 
+1

질문에 문제가있는 코드를 사용하여 "이 문제를 시도했습니다 ..."를 포함하면 질문이 크게 개선되었을 것입니다. – duffymo

+0

질문은 속임수입니다. 질문을 받고 몇 번 대답했습니다. –

답변

162

예, 적절한 보안 권한이 있다고 가정합니다. 다른 클래스에서 액세스하는 경우 먼저 Field.setAccessible(true)을 사용하십시오.

import java.lang.reflect.*; 

class Other 
{ 
    private String str; 
    public void setStr(String value) 
    { 
     str = value; 
    } 
} 

class Test 
{ 
    public static void main(String[] args) 
     // Just for the ease of a throwaway test. Don't 
     // do this normally! 
     throws Exception 
    { 
     Other t = new Other(); 
     t.setStr("hi"); 
     Field field = Other.class.getDeclaredField("str"); 
     field.setAccessible(true); 
     Object value = field.get(t); 
     System.out.println(value); 
    } 
} 

그리고 아니, 당신은 일반적으로 ...이 작업을 수행하지 않아야는 클래스의 원래 저자의 의도를 전복입니다. 예를 들어, 필드가 일 때 일 수있는 모든 상황에서 유효성 검사가 적용되거나 다른 필드가 동시에 변경 될 수 있습니다. 의도 한 캡슐화 수준을 효과적으로 위반하고 있습니다.

+0

Jon이 언급했듯이 이렇게해야하는 경우는 거의 없습니다. 불행히도 제가 인정하는 것보다 더 많은 것을해야만했습니다. 그리고 그것은 아주 못생긴 코드를 만듭니다. – aperkins

+0

FAIL. 'setAccessible'에 대한 호출을 제거하면 보안 관리자가있는 경우에도 여전히 작동합니다. :) 그러나 +1은 "당신은 보통 이것을하지 말아야합니다". –

+0

@Tom : 감사합니다. 할일이 필요한 상황에 맞게 예제를 수정했습니다. –

42

예.

Field f = Test.class.getDeclaredField("str"); 
    f.setAccessible(true);//Very important, this allows the setting to work. 
    String value = (String) f.get(object); 

그런 다음 필드 개체를 사용하여 클래스 인스턴스의 값을 가져옵니다.

get 메소드는 종종 사람들을 혼란스럽게합니다. 필드가 있지만 개체의 인스턴스가 없습니다. get 방법으로 전달해야합니다.

+0

약식. 간결. 엄지 손가락. – Christian

5

예 가능합니다.

Field privateField = Test.class.getDeclaredField("str"); 

는 또한, 당신은 당신이 원하는 경우, 액세스 할 수 있도록이 필드를 설정해야합니다

당신은 당신의 개인 필드의 이름으로, (대신 getField 방법의)를 getDeclaredField 방법을 사용할 필요가 개인 필드에 액세스 :

privateField.setAccessible(true); 

을 가입 한 후에는 STR 필드의 값에 액세스하려면, 필드 인스턴스에 get 메소드를 사용할 수 있습니다.

관련 문제