2009-06-02 7 views
4

I는 다음과 같습니다 클래스가 다음과 같이Java Generics 및 리플렉션!

public class UploadBean { 


    protected UploadBean(Map<String,?> map){ 
     //do nothing. 
    } 
} 

이 반사를 사용하고 해당 생성자를 호출하여 객체를 생성하기를, 나는 코드를 작성 :이 코드와 런타임에 실패

Class<?> parTypes[] = new Class<?>[1]; 
parTypes[0] = Map.class; 
Constructor ct = format.getMappingBean().getConstructor(parTypes); 
Object[] argList = new Object[1]; 
argList[0] = map; 
Object retObj = ct.newInstance(argList); 

"그러한 메소드 예외 없음". 이제 어떻게 param 유형을 올바르게 설정합니까? 생성자의 일반지도 인수가 식별되도록하려면?

+0

"형식"이란 무엇입니까? –

+0

형식은 다음과 같이 구현됩니다. public interface FormatFactory { \t public Map getFormat(); \t public class getMappingBean(); } – Jay

답변

7

생성자가 public 인 경우 또는을 사용하면 getConstructor 대신 getDeclaredConstructor을 사용해야합니다.

(. 당신은 당신이 일반적으로 액세스 할 수없는 것 어딘가에서이 전화를하려는 경우 setAccessible를 사용해야합니다)

편집 :

import java.lang.reflect.*; 
import java.util.*; 

public class UploadBean { 

    // "throws Exception" just for simplicity. Not nice normally! 
    public static void main(String[] args) throws Exception { 
     Class<?> parTypes[] = new Class<?>[1]; 
     parTypes[0] = Map.class; 
     Constructor ct = UploadBean.class.getDeclaredConstructor(parTypes); 
     Object[] argList = new Object[1]; 
     argList[0] = null; 
     Object retObj = ct.newInstance(argList); 
    } 

    protected UploadBean(Map<String,?> map){ 
     //do nothing. 
    } 
} 
: 여기 괜찮 작업을 보여줄 수있는 테스트입니다
+0

또는 getDeclaredConstructor()를 사용하십시오.하지만 너무 늦었습니다. –

+0

이 작동하지 않습니다. 이 예외를 다시 throw합니다. java.lang.NoSuchMethodException : test.fileupload.XYZUploadBean. (java.util.Map) – Jay

+0

getDeclaredConstructor() 다음에 setAccessible (true)가 필요합니까? 내 테스트에서는 그렇지 않지만, UploadBean에서 main()을 분리하지 않았습니다. –

0

나는 당신이 setAccessible 방법은 당신이 액세스 방법을 대체 할 수 있습니다

ct.setAccessible(true) 

호출해야합니다 생각합니다.

1

일반 정보는 런타임에 사용할 수 없으며 단지 정적 분석을위한 것입니다. 따라서 제네릭이없는 것처럼 처리하십시오.

+1

예, 오류는 제네릭과 아무런 관련이 없습니다. 이것은 실제로 반영 질문입니다. (그러나이 점을 명확히하는 것이 좋습니다.) –

+0

@mmyers가 동의했습니다. – Jay