Java에서 private
액세스 수정자는 클래스 외부에서 볼 수 없기 때문에 안전한 것으로 간주합니다. 그러면 외부 세계도 그 방법에 대해 알지 못합니다.
하지만 Java 리플렉션이이 규칙을 깨는 데 사용할 수 있다고 생각했습니다. 다음 경우를 고려하십시오.
public class ProtectedPrivacy{
private String getInfo(){
return "confidential";
}
}
이제 다른 클래스에서 정보를 얻을 것입니다.
public class BreakPrivacy{
public static void main(String[] args) throws Exception {
ProtectedPrivacy protectedPrivacy = new ProtectedPrivacy();
Method method = protectedPrivacy.getClass().getDeclaredMethod("getInfo", null);
method.setAccessible(true);
Object result = method.invoke(protectedPrivacy);
System.out.println(result.toString());
}
}
지금은 위와 같은 일을하기 위해서는 메소드 이름을 알아야하므로 여전히 private 메소드가 안전하다고 생각했습니다. 그러나 다른 누군가가 작성한 private 메서드를 포함하는 클래스는 가시성이 없습니다.
그러나 코드 줄 아래부터 내 요점이 무효화됩니다.
Method method[] = new ProtectedPrivacy().getClass().getDeclaredMethods();
이제 여기 method[]
에는 위의 작업에 필요한 모든 것이 포함됩니다. 제 질문은 Java 리플렉션을 사용하여 이러한 종류의 일을 피할 수있는 방법이 있습니까?
내 질문을 명확히하기 위해 Java Documentation 에서 몇 가지 요점을 인용했습니다 .
액세스 수준 선택에 대한 팁 :
다른 프로그래머가 클래스를 사용하는 경우 오용으로 인한 오류가 발생하지 않도록해야합니다. 액세스 수준은이를 수행하는 데 도움이 될 수 있습니다. 특정 구성원에게 적합한 가장 제한적인 액세스 수준을 사용합니다. 정당한 이유가없는 한 비공개로 사용하세요.
getDeclaredMethods
쓰레기처럼 보이는 이름이 반환 되기 때문에 도움이 될 수 있습니다 .