Java泛型和反思!

时间:2009-06-02 14:31:52

标签: java generics reflection

我有一个看起来像这样的课程:

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

此代码在运行时因“No Such Method Exception”而失败。 现在,如何正确设置参数类型?!这样可以识别构造函数中的泛型map参数吗?

3 个答案:

答案 0 :(得分: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.
    }
}

答案 1 :(得分:1)

通用信息在运行时不可用,它仅用于静态分析,因此就像仿制药不存在一样。

答案 2 :(得分:0)

我相信你需要打电话

ct.setAccessible(true)

setAccessible方法允许您覆盖访问方法。