2009-06-02 60 views
4

我有一个类,看起来像这样:Java泛型和反思!

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); 

此代码在运行时失败, “没有这样的方法例外”。 现在,我该如何正确设置参数类型?!这样构造函数中的通用映射参数被识别出来了?

+0

什么是“格式”? – 2009-06-02 14:36:27

+0

格式是这样的一个实现: public interface FormatFactory { \t public Map getFormat(); \t public class <?扩展UploadBean> getMappingBean(); } – Jay 2009-06-02 14:44:10

回答

7

该构造函数被保护 - 如果你使它公开使用getDeclaredConstructor而不是getConstructor它应该工作。

(你需要使用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(),因为我刚刚发现(但太晚了!)。 – 2009-06-02 14:41:32

0

我相信你需要调用

ct.setAccessible(true) 

的setAccessible方法允许你覆盖的接入方式。

1

通用信息在运行时不可用,它只是用于静态分析,所以就像泛型不存在一样。