以通用方式获取POJO的属性

时间:2018-07-10 07:30:50

标签: java java-8

我正在以List的形式获取对象的属性,其中AvsAttribute如下:

     class AvsAttribute {
        String attrName,
        String value
    }

我要按以下方式获取任何实体的属性值,因为我不想使用反射,所以这样做了:

 @Override
  public List<AvsAttribute> getAttributes(List<String> attributeNameList, final @NonNull T entity)
  throws JsonProcessingException, JSONException {
  List<AvsAttribute> attributeList = new ArrayList<>();
  objectMapper.setSerializationInclusion(Include.NON_NULL);
  String jsonString = objectMapper.writeValueAsString(entity);
  JSONObject jsonObject = new JSONObject(jsonString);
  Iterator<String> keysItr = jsonObject.keys();
  while (keysItr.hasNext()) {
    String key = keysItr.next();
    String value = jsonObject.get(key).toString().trim();
  attributeList.add(AvsAttribute.builder().name(key).value(value).build());
   }
  if (CollectionUtils.isNotEmpty(attributeNameList)) {
    return attributeList.stream().filter(item -> attributeNameList.contains(item.getName()))
      .collect(Collectors.toList());
}
return attributeList;

}

但是我想使AvsAttribute通用如下:

      class AvsAttribute<T> {
        String attrName,
        T value
    }

但是我无法弄清楚应该对上面的getAttributes()函数进行什么更改,以便它可以与上述通用类一起工作。

2 个答案:

答案 0 :(得分:0)

我认为它已经可以使用通用类型参数了。您需要在.value(String value)构建器中设置AvsAttribute函数,以将给定的字符串安全地解析为类型T
然后,您可以放心,以下行将正确获取通用属性值:

AvsAttribute.builder().name(key).value(value).build()

这有意义吗?
无论如何,祝您的代码好运。

答案 1 :(得分:0)

?声明和attributeList类型中使用通配符return