Как я могу найти конструктор, не зная его формальных типов параметров? - PullRequest
0 голосов
/ 25 апреля 2018

Я хочу создать экземпляр класса с помощью отражения, и я знаю, что данные параметры конструктора совместимы с конструктором.Хотя у меня нет формальных параметров типа конструктора.

Я знаю, что могу пройти через все конструкторы класса, чтобы сделать это, но есть ли более прямой путь в стандартном API Java 8?

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Если 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 от универсального типа.

0 голосов
/ 25 апреля 2018

Если классы времени выполнения ваших параметров соответствуют точно объявленному типу параметров конструктора, вы можете построить соответствующий массив из 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);
    }
}

Это печатает:

i: 2 name: name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...