gpt4 book ai didi

java - 使用反射获取 Field 的通用类型

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:41:29 24 4
gpt4 key购买 nike

有没有办法在Java中获取字段的泛型类型?

我有以下对象变量:

protected ScheduleView<WantedClass> scheduleLine1;
protected ScheduleView<SomeOtherClass> scheduleLine2;

现在我尝试使用反射来获取所有类型为 ScheduleView 且类型为 WantedClass 的对象变量:

Arrays.asList(this.getClass().getDeclaredFields()).stream().map(field -> {
ScheduleView<WantedClass> retValue = null;

System.out.println(field.getGenericType()); // prints control.ScheduleView<dto.WantedClass>

try {
if (field.getType() == ScheduleView.class) { // here I also want to check if the generic type is WantedClass
retValue = (ScheduleView<WantedClass>) field.get(this);
} else {
retValue = null;
}
} catch (IllegalAccessException e) {
retValue = null;
} finally {
return retValue;
}
}).filter(scheduleView -> scheduleView != null).forEach(scheduleView -> {
/* some more code */
});

如果泛型类型是 WantedClass,我还想检查 if 语句。我也尝试使用 getGenericType() 方法,但看起来像这样是不可能的:

field.getGenericType() == ScheduleView<WantedClass>.class

那么有没有办法获取字段的通用类型呢?

最佳答案

您必须检查该字段是否为ParameterizedType,然后检查getActualTypeArguments 的内容,例如

    for (Field field : Ideone.class.getDeclaredFields()) {
Type type = field.getGenericType();
if (type instanceof ParameterizedType) {
ParameterizedType ptype = (ParameterizedType) type;
if (ptype.getRawType() == ScheduledView.class) {
if (ptype.getActualTypeArguments().length == 1
&& ptype.getActualTypeArguments()[0] == WantedClass.class) {
// Do whatever with the field.
System.out.println(field.getName());
}
}
}
}

Ideone demo

关于java - 使用反射获取 Field 的通用类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37003562/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com