0

说我有一颗豆子

public class SomeBean{
     List<String> messages;
     List<Integer> scores;
     String id;
     int  number;

....}

我正在使用以下代码来处理或转储属性

        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()”的值对于 messages 和 scores 都是“java.util.List”。

我如何判断“消息”的属性描述符是否指代List<String>和“分数”指的是List<Integer>

4

2 回答 2

8

有两种情况。

第一种情况是在编译时不知道属性的参数化类型:

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);
        }
    }
}

这里的关键是获取 read 或 write 方法,并分别使用 APIMethod.getGenericReturnType()Method.getParameterTypes()

请注意,处理java.lang.reflect.Type一般会变得非常乏味/棘手,例如:

public Map<Nation, Map<A extends PostCode, B extends Location>> getGlobalPostCodes() { ... }
于 2011-04-12T19:11:38.620 回答
-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 相关的代码来执行此操作,但看起来您可以。

于 2011-04-12T19:10:57.840 回答