Класс Generic Init, использующий рефлексию Java - PullRequest
0 голосов
/ 26 апреля 2019

В настоящее время я автоматизирую процесс обработчика данных. Под автоматизацией я подразумеваю, что DataHandlers запускаются автоматически через отражение в зависимости от конкретной конфигурации.

Но я нахожусь в состоянии, когда я не знаю, как мне решить эту проблему. Именно об этом мире кода:

Class<?> clazz = classLoader.loadClass(d);
Object values = clazz.getMethod("values").invoke(null);
RSA.addDataHandler(clazz,new DataHandlerSetAdapter<>(values));

Я загружаю класс через classLoader и вызываю статический метод , называемый "values", который возвратил кучу, как вы сказали, правильно, значений!

Теперь проблема в new DataHandlerSetAdapter<>(values)), который имеет ошибку в <>, потому что Объект не знает, какие классы s инициировать.

Невозможно определить аргументы (невозможно разрешить конструктор)

Если бы этот код был на C #, я бы использовал typeof (), но в JAVA нет ничего подобного, возможно instanceof, но я не могу использовать это на данный момент. Кстати, .values ​​() возвращает массив того же типа (enum).

Как я могу решить эту проблему?

// редактировать

с методом .getReturnType() в методе Я бы получил тип возвращаемого значения, но я не могу применить его к DataHandlerSetAdapter<>

Класс DataHandlerSetAdapter

public class DataHandlerSetAdapter<T> implements DataHandler<T> {
    private final Set<T> values = new ConcurrentSkipListSet<>();
    . 
    . 
    .
}

1 Ответ

0 голосов
/ 26 апреля 2019

Мне не понятно, что вы пытаетесь сделать.Но если загружаемый класс - это enum, то почему вы не делаете это следующим образом:

Class<? extends Enum<?>> clazz = classLoader.loadClass(d);
Enum<?>[] values = clazz.getEnumConstants();
RSA.addDataHandler(clazz, new DataHandlerSetAdapter<>(values));

В качестве альтернативы вы можете использовать необработанные типы: RSA.addDataHandler(clazz, new DataHandlerSetAdapter(values)) - обратите внимание на отсутствие бриллиантов <>.

Но все же я не уверен, что погода сработает для вас или нет.Пожалуйста, предоставьте следующую информацию, чтобы понять причину сбоя.

Подпись DataHandlerSetAdapter конструктор Подпись RSA.addDataHandler(...) метод Дополнительная информация о RSA, которую вы использовали в своем фрагменте кода.(например, это класс или объект)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...