일반적으로 JAVA의 리플렉션 메커니즘을 통해 다른 클래스의 프라이빗 필드와 프라이빗 메서드에 접근하는 것이 가능하다고 생각하지만 그렇게 어렵지는 않습니다.
참고: 이 코드는 일부 단위 테스트나 일반 프로그램을 수행하는 것처럼 별도의 JAVA 프로그램에서 실행하는 경우에만 작동합니다. JAVA APPLET 내에서 이 방법을 사용하려면 SecurityManager를 약간 수정해야 합니다. 그러나 자주 처리할 필요가 없으므로 여기서는 자세히 설명하지 않겠습니다.
이 콘텐츠의 목록은 다음과 같습니다.
1. 비공개 필드에 액세스합니다.
2. 개인 메소드에 액세스하십시오.
비공개 필드에 액세스:
비공개 필드에 액세스하려면 Class.getDeclaredField(String name) 또는 Class.getDeclaredFields() 메서드를 호출해야 합니다. Class.getField(String name) 및 Class.getFields() 메소드는 공통 필드만 반환하므로 효과가 없습니다. 다음은 비공개 필드를 포함하는 클래스의 예이며, 클래스 아래에는 리플렉션을 통해 비공개 필드에 액세스하는 코드가 있습니다.
다음과 같이 코드 코드를 복사합니다 .
공개 클래스 PrivateObject {
private String privateString = null; //프라이빗 필드로 선언됨
공개 PrivateObject(문자열 privateString) {
this.privateString = privateString;
}
}
다음과 같이 코드 코드를 복사합니다 .
PrivateObject privateObject = new PrivateObject("The Private Value");//객체 인스턴스화
필드 privateStringField = PrivateObject.class.
getDeclaredField("privateString");
privateStringField.setAccessible(true);//비공개 필드에 대한 액세스 허용
String fieldValue = (String) privateStringField.get(privateObject);//프라이빗 필드 값 가져오기
System.out.println("fieldValue = " + fieldValue);
이 코드는 PrivateObject 개체의 개인 필드 privateString 값인 "fieldValue = The Private Value"라는 텍스트를 인쇄합니다.
PrivateObject.class.getDeclaredfield("privateString") 메서드를 사용했다는 점에 유의하세요. 비공개 필드를 반환하는 것은 이 메서드에 대한 호출입니다. 이 메서드는 지정된 클래스를 기반으로 하는 필드만 반환하고 상위 클래스에서 선언한 필드는 반환하지 않습니다.
또한 굵은 글씨로 표시된 설명을 주의 깊게 살펴보십시오. Field.setAccessible(true)을 호출하면 지정된 필드 인스턴스에 대한 액세스 검사가 꺼집니다. 이는 리플렉션에만 유효합니다. 이제 호출자가 해당 범위에 없더라도 비공개, 보호 또는 기본 여부에 관계없이 액세스할 수 있습니다. 컴파일러가 허용하지 않기 때문에 여전히 일반 메서드를 통해 필드에 액세스할 수 없습니다.
프라이빗 메소드 접근 <BR>프라이빗 메소드에 접근하려면 Class.getDeclaredMethod(String name,Class[] 매개변수 유형) 또는 Class.getDeclaredMethods() 메소드를 호출해야 합니다. Class.getMethod(String name,Class[]parameterTypes) 및 Class.getMethods() 메서드는 공용 메서드만 반환하므로 어떤 역할도 수행하지 않습니다. 다음은 프라이빗 메서드가 있는 클래스의 간단한 예입니다. 클래스 아래에는 리플렉션을 통해 프라이빗 메서드에 액세스하는 코드가 있습니다.
다음과 같이 코드 코드를 복사합니다 .
공개 클래스 PrivateObject {
개인 문자열 privateString = null;
공개 PrivateObject(문자열 privateString) {
this.privateString = privateString;
}
개인 문자열 getPrivateString(){//개인 메서드
this.privateString을 반환합니다.
}
}
다음과 같이 코드 코드를 복사합니다 .
PrivateObject privateObject = new PrivateObject("개인 값");
메소드 privateStringMethod = PrivateObject.class.
getDeclaredMethod("getPrivateString", null);
privateStringMethod.setAccessible(true);
문자열 반환 값 = (문자열)
privateStringMethod.invoke(privateObject, null);
System.out.println("returnValue = " + returnValue);
이 코드 예제는 private 메서드의 반환 값인 "returnValue = The private Value" 텍스트를 인쇄합니다.