将字段类型传递为Class <t>

时间:2018-12-21 09:42:12

标签: java reflection fieldtype

我有以下代码。

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;
}

我在以后如何将字段类型作为Class对象传递时感到很挣扎。我将在反射中使用它们(clazz这里是类Contact):

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

假设typeString,如果我将其打印为: 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 :(得分:2)

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;
}

请注意,您收集了声明的字段,然后似乎要在通过反射检索的方法中使用它们。还不是很清楚。

答案 1 :(得分:1)

感谢您尝试帮助我。但是,我碰到了运气。我只是改变了:

type.getClass()

type.toString().getClass()

答案 2 :(得分:0)

尝试更改

public <T> List<Object>

通过

public <T> List<T>