Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何为JavaBean使用参数化属性名称和类型的lis_Java_Generics_Reflection_Introspection_Propertydescriptor - Fatal编程技术网

如何为JavaBean使用参数化属性名称和类型的lis

如何为JavaBean使用参数化属性名称和类型的lis,java,generics,reflection,introspection,propertydescriptor,Java,Generics,Reflection,Introspection,Propertydescriptor,说我有一颗豆子 public class SomeBean{ List<String> messages; List<Integer> scores; String id; int number; 公共类SomeBean{ 列出信息; 列出分数; 字符串id; 整数; 。。。。 } 我使用以下代码来处理或转储propreties BeanInfo beanInfo = Introspector.getBeanI

说我有一颗豆子

public class SomeBean{
     List<String> messages;
     List<Integer> scores;
     String id;
     int  number;
公共类SomeBean{
列出信息;
列出分数;
字符串id;
整数;
。。。。 }

我使用以下代码来处理或转储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());

        }
BeanInfo-BeanInfo=Introspector.getBeanInfo(beanClass,Object.class);
PropertyDescriptor描述符[]=beanInfo.getPropertyDescriptors();
int stop=描述符。长度;
对于(int i=0;i
我希望能够获得“分数”和“消息”的参数化类型。 当我破坏代码时,“descriptor.getPropertyType().getName()”的值对于消息和分数都是“java.util.List”


我如何判断“message”的属性描述符是否指的是
List
,而“scores”的属性描述符是否指的是
List

只要字段具有完全指定的编译时类型,如您的示例所示(
List
,而不是类似于
List
)您可以使用反射来获取以下信息:

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));
  }
}
for(字段:SomeBean.class.getDeclaredFields()){
Type=field.getGenericType();
System.out.println(field.getName()+“:”+类型);
if(类型instanceof ParameterizedType){
ParameteredType parameterized=(ParameteredType)类型;
Type raw=参数化的。getRawType();//比如说,这将是类
Type[]typeArgs=参数化的.getActualTypeArguments();
System.out.println(Arrays.toString(typeArgs));
}
}
我不确定您是否可以使用bean相关的代码来实现这一点,但看起来您可以做到。

有两种情况

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

public class Pair<A, B> {
  public A getFirst() { ... }
  public B getSecond() { ... }
}
这里的关键是获取read或write方法,并分别使用API
方法.getGenericReturnType()
方法.getParameterTypes()

注意处理<代码> java .ang.Expor。类型< /COD>一般会变得相当乏味/棘手,例如,考虑:

public Map<Nation, Map<A extends PostCode, B extends Location>> getGlobalPostCodes() { ... }
公共映射getGlobalPostCodes(){…}

我知道,对于Field[]f=class.getDeclaredFields(),这是可能的,但问题是它不会得到继承的字段。当递归遍历所有父类时,它变得非常混乱。谢谢
public Map<Nation, Map<A extends PostCode, B extends Location>> getGlobalPostCodes() { ... }