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

我有一个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    
}

有没有办法在运行时我可以获得每个属性的泛型类型参数(Foo和Bar)?

我强烈怀疑我不能因为类型擦除,但如果有人能证实我的怀疑,我会很感激.

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

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

转载注明原文:java – 在运行时获取属性类型 - 代码日志