如何在不知道其形式参数类型的情况下找到构造函数?

时间:2018-04-25 13:20:53

标签: java reflection constructor

我想通过反射创建一个类的实例,我知道给定的构造函数参数与构造函数兼容。虽然我没有构造函数的形式参数类型。

我知道我可以通过该类的所有构造函数来执行此操作,但在标准Java 8 API中是否有更直接的方法?

2 个答案:

答案 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