Java에서 리플렉션을 통해 비공개 필드 str에 액세스 할 수 있습니까? 예를 들어이 필드의 값을 가져 오는 것입니다.Java에서 리플렉션을 통해 비공개 필드에 액세스 할 수 있습니까
class Test
{
private String str;
public void setStr(String value)
{
str = value;
}
}
Java에서 리플렉션을 통해 비공개 필드 str에 액세스 할 수 있습니까? 예를 들어이 필드의 값을 가져 오는 것입니다.Java에서 리플렉션을 통해 비공개 필드에 액세스 할 수 있습니까
class Test
{
private String str;
public void setStr(String value)
{
str = value;
}
}
예, 적절한 보안 권한이 있다고 가정합니다. 다른 클래스에서 액세스하는 경우 먼저 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);
}
}
그리고 아니, 당신은 일반적으로 ...이 작업을 수행하지 않아야는 클래스의 원래 저자의 의도를 전복입니다. 예를 들어, 필드가 일 때 일 수있는 모든 상황에서 유효성 검사가 적용되거나 다른 필드가 동시에 변경 될 수 있습니다. 의도 한 캡슐화 수준을 효과적으로 위반하고 있습니다.
Jon이 언급했듯이 이렇게해야하는 경우는 거의 없습니다. 불행히도 제가 인정하는 것보다 더 많은 것을해야만했습니다. 그리고 그것은 아주 못생긴 코드를 만듭니다. – aperkins
FAIL. 'setAccessible'에 대한 호출을 제거하면 보안 관리자가있는 경우에도 여전히 작동합니다. :) 그러나 +1은 "당신은 보통 이것을하지 말아야합니다". –
@Tom : 감사합니다. 할일이 필요한 상황에 맞게 예제를 수정했습니다. –
예.
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
방법으로 전달해야합니다.
약식. 간결. 엄지 손가락. – Christian
예 가능합니다.
Field privateField = Test.class.getDeclaredField("str");
는 또한, 당신은 당신이 원하는 경우, 액세스 할 수 있도록이 필드를 설정해야합니다
당신은 당신의 개인 필드의 이름으로, (대신 getField 방법의)를 getDeclaredField 방법을 사용할 필요가 개인 필드에 액세스 :
privateField.setAccessible(true);
을 가입 한 후에는 STR 필드의 값에 액세스하려면, 필드 인스턴스에 get 메소드를 사용할 수 있습니다.
질문에 문제가있는 코드를 사용하여 "이 문제를 시도했습니다 ..."를 포함하면 질문이 크게 개선되었을 것입니다. – duffymo
질문은 속임수입니다. 질문을 받고 몇 번 대답했습니다. –