2014-12-03 4 views
1

test() 메소드가 public 일 때이 프로그램이 올바르게 실행되었지만 수정자를 private으로 변경하자마자 런타임 오류가 발생했습니다. 이유를 설명 할 수있는 사람이 있습니까? 당신이 setAccessible(true)getDeclaredMethod 경우 반환 private 메소드를 호출 할 필요가 여기 왜리플렉션 API의 메소드 클래스

package ObjectClass; 
import java.lang.reflect.Method; 

public class reflect8 { 

     public static void main(String[] args) throws Exception { 

      Class c1 = Class.forName("ObjectClass.Reflect8A"); 

      Object obj = c1.newInstance(); 

      Method m1 = c1.getDeclaredMethod("test"); 

      m1.invoke(obj); 

    } 
} 

class Reflect8A { 

     private void test() { 

      System.out.println("from test..."); 
     } 
    } 
+0

는 않습니다 물론 또한 http://stackoverflow.com/questions/19135218/invoke-private-method-with-java-lang-invoke-methodhandle – Raedwald

+0

음을 참조하십시오. '사적인'이 무엇을 의미하는지 아십니까? – Raedwald

답변

3

이다.

Javadoc of getDeclaredMethod (강조 광산) :

공개, 보호, 기본 (패키지)을 포함한 모든 선언이 Class 객체가 나타내는 클래스 또는 인터페이스의 메소드, 를 반영하는 Method 객체가 들어있는 배열을 돌려줍니다 액세스 , 개인 메서드 (상속 된 메서드 제외)

Javadoc of invoke

:

는시 IllegalAccessException를 throw -이 Method 객체가 Java 언어 액세스 제어 및 기본 방법을 액세스되어 시행되는 경우.

Javadoc of setAccessible (강조 광산) :

은 지정된 부울 값이 객체의 accessible 플래그를 설정합니다. 값이 true이면 반영된 객체가 사용될 때 Java 언어 액세스 검사를 억제해야 함을 나타냅니다.

3
Method m1 = c1.getDeclaredMethod("test"); 
m1.setAccessible(true); 
m1.invoke(obj); 
+0

@ Tkachur_evgen, 그것은 작동하지만 우리는 런타임에 클래스의 인스턴스를 얻었으므로 setAccessible (true) – Aamir

+0

@Aamir을 호출하지 않고 해당 인스턴스를 통해 private 메소드에 액세스 할 수없는 이유는 private 한정자가 멤버 만 액세스 할 수 있도록 지정하기 때문입니다 자체 수업 내에서 –

관련 문제