说我有一个豆
public class SomeBean{
List<String> messages;
List<Integer> scores;
String id;
int number;
.... }
我使用以下代码处理或转储propreties
BeanInfo beanInfo = Introspector.getBeanInfo(beanClass, Object.class);
PropertyDescriptor descriptors[] = beanInfo.getPropertyDescriptors();
int stop = descriptors.length;
for (int i = 0; i < stop; ++i) {
PropertyDescriptor descriptor = descriptors[i];
logger.info(descriptor.getName() + " : " + descriptor.getPropertyType().getName() + ", writemethod :" + descriptor.getWriteMethod());
}
我希望能够获得“分数”和“消息”的参数化类型。 当我破坏代码时,“descriptor.getPropertyType()。getName()”的值对于消息和分数都是“java.util.List”。
如何判断“消息”的属性描述符是指List<String>
,而“得分”是指List<Integer>
?
答案 0 :(得分:7)
有两种情况。
第一种情况是在编译时不知道属性的参数化类型:
public class Pair<A, B> {
public A getFirst() { ... }
public B getSecond() { ... }
}
在这种情况下,你无法在编译时知道,并且是@darioo正在谈论的内容。
第二种情况是你的,当属性的类型参数在运行时已知。下面的代码可以帮助您确切了解您想要做的事情:
BeanInfo beanInfo = Introspector.getBeanInfo(beanClass, Object.class);
PropertyDescriptor descriptors[] = beanInfo.getPropertyDescriptors();
for (PropertyDescriptor d : descriptors) {
final Type type = d.getReadMethod().getGenericReturnType();
if (type instanceof ParameterizedType) {
ParameterizedType pt = (ParameterizedType) type;
System.out.println(d.getDisplayName());
for (Type atp : pt.getActualTypeArguments()) {
System.out.println(" " + atp);
}
}
}
这里的关键是获取读取或写入方法,并分别使用API Method.getGenericReturnType()
或Method.getParameterTypes()
。
请注意,处理java.lang.reflect.Type
通常会非常繁琐/棘手,例如:
public Map<Nation, Map<A extends PostCode, B extends Location>> getGlobalPostCodes() { ... }
答案 1 :(得分:-1)
只要字段具有完全指定的编译时类型(如示例中的List<String>
而不是List<T>
,那就是),您可以使用反射来获取此信息:
for (Field field : SomeBean.class.getDeclaredFields()) {
Type type = field.getGenericType();
System.out.println(field.getName() + ": " + type);
if (type instanceof ParameterizedType) {
ParameterizedType parameterized = (ParameterizedType) type;
Type raw = parameterized.getRawType(); // This would be Class<List>, say
Type[] typeArgs = parameterized.getActualTypeArguments();
System.out.println(Arrays.toString(typeArgs));
}
}
不确定你是否可以使用与bean相关的代码执行此操作,但看起来你可以。