我想通过反射创建一个类的实例,我知道给定的构造函数参数与构造函数兼容。虽然我没有构造函数的形式参数类型。
我知道我可以通过该类的所有构造函数来执行此操作,但在标准Java 8 API中是否有更直接的方法?
答案 0 :(得分:3)
如果参数的运行时类与完全声明的构造函数参数类型匹配,则可以构建相应的Traceback (most recent call last):
File "/Users/leejoonsung/PycharmProjects/lunar_lander/lunar_lander_ml_states_player.py", line 406, in <module>
a = model.predict_classes(s)
AttributeError: 'GridSearchCV' object has no attribute 'predict_classes'
实例数组,然后查找构造函数:
Class
这适用于在此示例中声明的构造函数:
public static void main(String[] args) throws Exception {
Object[] params = new Object[] {Integer.valueOf(2), "name"};
Class<?> cls[] = new Class<?>[params.length];
List<Class<? extends Object>> classes =
Arrays.asList(params).stream().map(p -> p.getClass())
.collect(Collectors.toList());
for(int i = 0; i < params.length; i++) {
cls[i] = classes.get(i);
}
Person.class.getConstructor(cls)
.newInstance(params);
}
打印:
class Person {
public Person(Integer i, String name) {
System.out.println("i: " + i + " name: " + name);
}
}
答案 1 :(得分:1)
如果with Java 8 API
表示使用流,则可以执行以下操作:
public static <T> T createInstance(Class<T> clz, Object... params) throws Exception {
Class<?>[] c = Arrays
.stream(params)
.map(Object::getClass)
.toArray(Class<?>[]::new);
return clz.getConstructor(c).newInstance(params);
}
测试:
public static void main(String... args) throws Exception {
String s = createInstance(String.class, (Object) new char[] {'h', 'e', 'l', 'l', 'o'});
System.out.println(s);
}
输出:
hello
基本上和其他答案一样,也许更优雅......
我的函数对于原始类型会失败,因为我无法从泛型类型中获取Integer.TYPE
。