2012-11-22 3 views
7

AB이 있으며, BA으로 확장됩니다. 또한 BA 유형의 인수가있는 생성자가 있습니다. bObj이라는 B 유형의 개체도 있습니다.자바 리플렉션 getConstructor 메소드

B.class.getConstructor(new Class[] { bObj.getClass() })을 호출하고 생성자를 가져 오는 방법이 있습니까? BA으로 확장 되었습니까? 지금 나는 NoSuchMethodException을 얻고있다.

감사합니다, 스탠

+2

무엇'B.class.getConstructors 사용에 대한

Class.getDeclaredConstructor() 

시도 정확히 하나의 인수를 취하는 것들을 찾고,'A.class'''가'thisAssignableFrom'이 아닌지 확인하십시오. –

+0

은 B의 생성자 공개입니까? –

+0

arne.b이 방법을 사용하는 한 가지 방법이지만 실제로 더 쉽다고 생각했습니다. Nandkumar 예, 공개입니다. –

답변

6

Apache Commons Lang에서 ConstructorUtils을 살펴 보시기 바랍니다.
그들은 생성자 발견 방법의 모든 방식을 가지고 있습니다.

귀하의 사례는 "Matching Accessible Constructors"으로 처리되어야합니다.

Here은 문맥에서 사용되는 방법의 예입니다. 기본적으로, 당신은 다음과 같이 호출 :

private <T> T instantiate(Class<?> input, Object parameter) { 
    try { 
    Constructor<?> constructor = ConstructorUtils.getMatchingAccessibleConstructor(input, parameter.getClass()); 
    return (T) constructor.newInstance(parameter); 
    } catch (Exception e) { 
    //handle various exceptions 
    } 
} 
+3

이것은 완벽하게 작동하며 내 의견으로는 꽤 우아합니다. 두 가지 추가 힌트 : (1) "input"매개 변수를 'Class input'으로 선언하면 반환 값을 캐스팅하지 못하게 할 수 있습니다. (2)'ConstructorUtils.invokeConstructor (Class cls, Object ... args)'는 생성자를 가져 와서 새로운 인스턴스를 생성합니다. –

3

아니, 당신은 정확한 매개 변수를 예상에 대한 검색 방법. 따라서 리플렉션 API의 찾기/검색 메소드를 사용하여 생성자, 메소드 또는 필드를 찾을 때 API는 equals()을 사용하여 일치하는 항목을 찾습니다.

Java 컴파일러에서 사용할 논리가 필요한 경우 FEST Reflect 또는 commons beanutils과 같은 프레임 워크를 사용해야합니다. 또는 getConstructors()에 전화하고 자신의 필터 코드를 작성해야합니다.

언뜻보기에 이것은 바보처럼 보입니다. Java 컴파일러가이를 수행 할 수 있다면 왜 Reflection API를 사용할 수 없습니까? 두 가지 이유가 있습니다. 첫째, Java 런타임은 컴파일러가 이미 올바른 메서드를 선택했기 때문에 호출 할 메서드를 검색 할 필요가 없습니다.

두 번째 이유는 Reflection API가 항상 "second best"였기 때문입니다. 모든 것을 할 수는 있지만 목표는 사용하기가 쉽지 않거나 친숙하지 않게 만드는 것이 었습니다. (적어도 내가 생각할 때마다 그것을 사용하는 것이 좋습니다 .-))

0

생성자가 코드 범위에서 액세스 (이 있는지 또는 클래스가 공개되지 않습니다) 공공 아니거나하지 않을 경우, 그것은

Class.getConstructor() 
을 통해 반환되지 않습니다

는`) (대신

관련 문제