Передайте тип поля как класс <T> - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть следующие коды.

public <T> List<Object> types(Class<T> clazz) {
        Field[] fields = clazz.getDeclaredFields();
        List<Object> types = Arrays.stream(fields)
                .map(Field::getType)
                .collect(Collectors.toList());
        return types;
}

Я борюсь за то, чтобы потом передать тип поля как объект класса.Я буду использовать их в отражении (clazz здесь класс Contact):

for (Object type : name(clazz)) {
            Method method = obj.getClass().getDeclaredMethod("myMethod", type.getClass());
}

Предполагая, что type - это String, если я распечатаю его как: System.out.println(type); вывод: class java.lang.String, но если я распечатал его как: System.out.println(type.getClass(); вывод: class java.lang.Class.Поэтому, если я передаю это как type.getClass(), рефлексия жалуется:

java.lang.NoSuchMethodException: Contact.myMethod(java.lang.Class)

Пожалуйста, помогите.Спасибо.

Ответы [ 3 ]

0 голосов
/ 21 декабря 2018

Field::getType возвращает класс.Зачем хранить его в Object в собранном вами потоке?Просто соберите их в Список классов.
Кроме того, метод параметризованного типа в данном случае беспомощенВы не хотите выводить любой тип.

Это даст:

public List<Class<?>> types(Class<?> clazz) {
    Field[] fields = clazz.getDeclaredFields();
    List<Class<?>> types = Arrays.stream(fields)
                               .map(Field::getType)
                               .collect(Collectors.toList());
    return types;
}

Обратите внимание, что вы собираете объявленные поля, а затем, похоже, хотите использовать их в методе, полученном с помощью отражения.Что не очень понятно.

0 голосов
/ 21 декабря 2018

Спасибо за попытку помочь мне.Я, однако, наткнулся на удачу.Я только что изменил:

type.getClass()

на

type.toString().getClass()
0 голосов
/ 21 декабря 2018

Попробуйте изменить

public <T> List<Object>

По

public <T> List<T>
...