2016-09-01 4 views
1

리플렉션을 처음 사용하고 보호 된 생성자를 인스턴스화 할 때 어떤 실수를했는지 알 수 없습니다. 아래 코드는 JsonProcessingException의 생성자를 인스턴스화하는 코드입니다.리플렉션을 사용하여 보호 된 생성자를 인스턴스화 할 때 NoSuchMethodException

getDeclaredConstructor에 의해 NoSuchMethodException가 발생하고 있습니다 만,이 예외 클래스에는 1, 2, 3 개의 파라미터로 protected 생성자가 있습니다.

final Constructor<JsonProcessingException> constructor = 
    JsonProcessingException.class 
     .getDeclaredConstructor(Object.class, Object.class); 
constructor.setAccessible(true); 

내 가정 : 내가 proteted 가정하는 것도 인스턴스화 할 수 있어요, 그래서 우리가 반사를 사용하여 개인 생성자를 인스턴스화 할 수 있음을 읽었습니다.

답변

2

또한 생성자의 인수 유형도 고려해야합니다. JsonProcessingException에는 두 개의 Object을 인수로 사용하는 생성자가 없지만 StringJsonLocationStringThrowable을 취하는 생성자가 있습니다. 두 번째 생성자는이처럼 쓰기에 액세스하려면 :

final Constructor<JsonProcessingException> constructor = 
    JsonProcessingException.class 
     .getDeclaredConstructor(new Class[]{String.class, Throwable.class}); 
constructor.setAccessible(true); 
JsonProcessingException ex = constructor.newInstance(msg, throwable); 

http://tutorials.jenkov.com/java-reflection/constructors.html

2

접근 방법은 거의 같지만 존재하지 않는 생성자를 반영하려고합니다. 예를 들어 올바른 서명을 전달해야합니다.

JsonProcessingException.class 
    .getDeclaredConstructor(String.class, Throwable.class) 
+0

참조 Object.class를에게 하나의 인자를 어떤 생성자를 얻기의 일반적인 방법을 전달되지 않는 이유는 무엇입니까? –

+1

@Vishwanathgowdak no (인수 유형이 실제로 'Object'가 아니면). 인수 유형을 알아야합니다. 덜 엄격한 일치가 필요한 경우에는'getDeclaredConstructors()'를 트래버스하여 적합한 생성자를 찾으십시오 – vsminkov

관련 문제