【问题标题】:Getting a list of private properties of Java class / object获取 Java 类/对象的私有属性列表
【发布时间】:2011-11-10 22:50:34
【问题描述】:

如何获取 getter 和 setter 中使用的 Java 对象的所有私有属性的列表。我试过PropertyUtilsMethodUtils 但没有运气。现在我正在尝试使用 Class 对象的getDeclaredFields(),它返回给我一个 Field 对象列表,然后检查它是否是私有属性,这是一种方法吗?或者有没有更好的解决方案。

【问题讨论】:

    标签: java reflection


    【解决方案1】:

    你说的,或者yourBean.getClass().getMethods() 然后 method.getName().startsWith("get") 在每个返回的方法上。

    请问您为什么需要这样做?

    【讨论】:

    • 我有一些来自需要进入 hashmap 的请求的 Java 类的自定义属性(它是属性之一)。而这个对象是一个类型参数,所以我使用反射来创建和填充这个对象。
    【解决方案2】:

    您可以查找所有的 getter 和 setter,看看是否有匹配的字段。但是字段可以以_fieldNamem_fieldName 开头,您只能推断getter/setter 与字段有关。

    【讨论】:

      【解决方案3】:

      这是一个很老的问题帖子,但为了新的搜索,我会在这里提供一个答案。

      在这里使用@highlycaffeinated 提供的方法:https://stackoverflow.com/a/6796254/776860

      您可以通过一些更改轻松提出所需的解决方案。

      仅检索私有字段名称列表

      public List<String> getMap(Object o) throws IllegalArgumentException, IllegalAccessException {
          List<String> result = new ArrayList<String>();
          Field[] declaredFields = o.getClass().getDeclaredFields();
          for (Field field : declaredFields) {
              if(!field.isAccessible()) {
                  result.add(field.getName());
              }
          }
          return result;
      }
      

      检索所有字段名称及其值的 Map

      public Map<String, Object> getMap(Object o) throws IllegalArgumentException, IllegalAccessException {
          Map<String, Object> result = new HashMap<String, Object>();
          Field[] declaredFields = o.getClass().getDeclaredFields();
          for (Field field : declaredFields) {
              field.setAccessible(true);
              result.put(field.getName(), field.get(o));
              } 
          }
          return result;
      }
      

      与 @highlycaffeinated 完全一样,只是提供了附加行 field.setAccessible(true);,它使您也可以内省 private 字段。

      【讨论】:

        【解决方案4】:

        我正在这样做:

        private Set<String> getModelProperties(Class<T> cls) {
            Set<String> properties = new HashSet<String>();
            for (Method method : cls.getDeclaredMethods()) {
                String methodName = method.getName();
                if (methodName.startsWith("set")) {
                    properties.add(Character.toLowerCase(
                      methodName.charAt(0)) + methodName.substring(3));
                }
            }
        
            return properties;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-11-11
          • 1970-01-01
          • 1970-01-01
          • 2018-01-21
          • 1970-01-01
          • 1970-01-01
          • 2021-02-17
          • 1970-01-01
          相关资源
          最近更新 更多