java - 在运行时获取属性类型

标签 java generics reflection groovy type-erasure

我有一个 Groovy 类,例如

class User {
    List<Foo> someFoos = new ArrayList<Foo>()
    List<Bar> someBars = new ArrayList<Bar>()    
}

我可以在运行时使用

迭代这些属性
def user = new User()
List<MetaProperty> setProperties = user.metaClass.properties.findAll {MetaProperty property ->
    property.name.startsWith('some')
}

如果我检查每个属性的类型 Set 被返回

setProperties.each {MetaProperty setProperty -> 
    assert setProperty.type == Set    
}

有什么方法可以在运行时为每个属性获取泛型类型参数(FooBar)?

我强烈怀疑我不能因为类型删除,但如果有人能证实我的怀疑,我将不胜感激。

最佳答案

是的,你可以。这些是字段定义,它们在运行时保留其类型定义。我会给你 java 代码,你也可以在 groovy 中使用它(我不知道 groovy 特定的解决方案)

Field[] fields = User.class.getDeclaredFields();
for (Field field : fields) {
    ParameterizedType pt = (ParameterizedType) field.getGenericType();
    Type concreteType = pt.getActualTypeArguments()[0];
}

关于java - 在运行时获取属性类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7235106/

相关文章:

java - 如何通过其他类访问存储到ArrayList中的对象的元素

java - Py4j launch_gateway 连接不正确

c# - 无法比较通用值

Java反射,从父类(super class)调用方法?

c# - 按名称调用类或选择案例/开关?

java - 运行 .jar 文件 - 双击与命令行执行

java - 结果集已关闭

c# - S : new() in c# 是什么意思

java - 如何指定通用类型作为函数参数

c# - 在运行时将属性的属性从一个实例复制到另一个实例(不同类型)