我一直在尝试确定类中字段的类型。我看过所有的自省方法,但还没有完全弄清楚怎么做。这将用于从java类生成xml/json。我已经看了这里的一些问题,但并没有找到确切的我需要的。
例子:
class Person {
public final String name;
public final List<Person> children;
}
当我处理这个物体时,我需要知道 chidren
字段是类型为的对象的列表 Person
,这样我就可以很好地控制它。
我试过了
for (Field field : Person.class.getDeclaredFields()) {
System.out.format("Type: %s%n", field.getType());
}
但这只会告诉我 List
,不是 List
的 Person
s
谢谢
8条答案
按热度按时间dwthyt8l1#
看看从java教程trail:reflectionapi中获取字段类型。
基本上,你需要做的是
java.lang.reflect.Field
你的班级和电话Field#getType()
在每个页面上(选中下面的“编辑”)。要获取所有对象字段,包括public、protected、package和private访问字段,只需使用Class.getDeclaredFields()
. 像这样:编辑:正如wowest在评论中指出的那样,你实际上需要打电话
Field#getGenericType()
,检查是否返回Type
是一个ParameterizedType
然后获取相应的参数。使用ParameterizedType#getRawType()
以及ParameterizedType#getActualTypeArgument()
获取参数的原始类型和类型数组ParameterizedType
分别。下面的代码演示了这一点:并将输出:
rsl1atfo2#
下面的例子回答了我的问题
这个输出
rqdpfwrv3#
我还没有找到任何通过继承层确定泛型字段类型的框架,所以我编写了一些方法:
此逻辑通过字段信息和当前对象类确定类型。
清单1—逻辑:
清单2-示例/测试:
我期待着听到你的反馈!
zaqlnxep4#
以这个片段为例:
关键类是field
bd1hkmkf5#
这是我的照片。它不能处理所有可能的情况(当然也有一些bug),但它确实处理了迄今为止在我的代码中发生的所有情况。这包括这些声明,对于许多用例来说,这应该是一个良好的开端:
实施:
u4vypkhs6#
正如dfa指出的,您可以使用
java.lang.reflect.Field.getType
. 您可以使用Field.getGenericType
(可能有通配符和绑定的泛型参数以及各种各样的疯狂)。你可以把田地弄过去Class.getDeclaredFields
(Class.getFields
将为您提供公共字段(包括supertpye的字段)-无意义。要获取基本类型字段,请通过Class.getSuperclass
. 检查修饰符的注意事项Field.getModifiers
-静态字段可能对您不感兴趣。gxwragnw7#
方法
field.getGenericType()
返回对Type
接口。实际类型可以是TypeVariable
或者GenericArrayType
或者ParameterizedType
或者Class
或者别的我现在不知道的事。检索字段的实际类型需要不同的方法。
下面是我的解决方案,它以typefieldtreenode对象树的形式获取公共字段的信息。
主要方法:
接下来是一个核心方法的列表,该方法将泛型参数的typevariable类型的元数据与泛型参数的实际类型绑定在一起。当泛型参数的实际类型是typevariable的示例时,方法使用前面获得的Map来还原该泛型参数的实际类型:
获取有关字段以及该字段类型的类的所有可用字段的数据:
用法:
对于以下测试类型,该解决方案按预期工作:
MyClass2<MyClass, MyClass, Double>
MyClass3<MyClass<Integer>, MyClass<Double>>
哪里:q5lcpyga8#