반응형
Java에서 리플렉션을 통해 개인 필드에 액세스 할 수 있습니까?
이 질문에 이미 답변이 있습니다.
Java에서 리플렉션을 통해 개인 필드 str에 액세스 할 수 있습니까? 예를 들어이 필드의 값을 가져옵니다.
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);
}
}
그리고 아니, 당신은 일반적으로 이것을해서는 안됩니다. 그것은 수업의 원래 저자의 의도를 뒤집는 것입니다. 예를 들어 필드가
일반적
으로 설정 될 수 있거나 다른 필드가 동시에 변경 될 수 있는 모든 상황에서 유효성 검사가 적용될 수 있습니다. 의도 된 캡슐화 수준을 효과적으로 위반하고 있습니다.
예.
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
메서드 에 전달해야합니다.
네 가능합니다.개인 필드의 이름과 함께 getField 메서드 대신 getDeclaredField 메서드를 사용해야합니다.
Field privateField = Test.class.getDeclaredField("str");
또한 비공개 필드에 액세스하려면이 필드에 액세스 할 수 있도록 설정해야합니다.
privateField.setAccessible(true);
완료되면 Field 인스턴스에서 get 메서드를 사용하여 str 필드의 값에 액세스 할 수 있습니다.참고 URL :
반응형
'Programming' 카테고리의 다른 글
ReferentialConstraint의 종속 속성은 저장소 생성 열에 매핑됩니다. (0) | 2020.08.27 |
---|---|
전역 기능과 장치 기능의 차이점 (0) | 2020.08.27 |
SQL 연결이 열려 있는지 또는 닫혀 있는지 확인 (0) | 2020.08.27 |
문자열이 여러 접두사 중 하나로 시작하는지 확인하는 방법은 무엇입니까? (0) | 2020.08.27 |
Django Rest Framework는 csrf를 제거합니다. (0) | 2020.08.27 |