我有一个看起来像这样的课程:
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参数吗?
答案 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方法允许您覆盖访问方法。