为了账号安全,请及时绑定邮箱和手机立即绑定

Java思考:如何获取Java类的所有getter方法并调用它们

Java思考:如何获取Java类的所有getter方法并调用它们

小怪兽爱吃肉 2019-12-20 10:12:08
我写了一个有很多getter的java类。现在我想获取所有getter方法并在某个时候调用它们。我知道有一些方法,例如getMethods()或getMethod(String name,Class ... parameterTypes),但是我只想确实获得吸气剂...,使用正则表达式?有人可以告诉我吗?
查看完整描述

3 回答

?
临摹微笑

TA贡献1982条经验 获得超2个赞

不要使用正则表达式,请使用Introspector:


for(PropertyDescriptor propertyDescriptor : 

    Introspector.getBeanInfo(yourClass).getPropertyDescriptors()){


    // propertyEditor.getReadMethod() exposes the getter

    // btw, this may be null if you have a write-only property

    System.out.println(propertyDescriptor.getReadMethod());

}

通常,您不需要Object.class的属性,因此可以使用带有两个参数的方法:


Introspector.getBeanInfo(yourClass, stopClass)

// usually with Object.class as 2nd param

// the first class is inclusive, the second exclusive

顺便说一句:有一些框架可以为您做到这一点,并向您展示高层次的观点。例如commons / beanutils有方法


Map<String, String> properties = BeanUtils.describe(yourObject);

(docs此处)就是这样做的:查找并执行所有getter并将结果存储在地图中。不幸的是,BeanUtils.describe()在返回之前将所有属性值转换为字符串。WTF。谢谢@danw


更新:


这是一个Java 8方法,该方法Map<String, Object>基于对象的bean属性返回a 。


public static Map<String, Object> beanProperties(Object bean) {

  try {

    return Arrays.asList(

         Introspector.getBeanInfo(bean.getClass(), Object.class)

                     .getPropertyDescriptors()

      )

      .stream()

      // filter out properties with setters only

      .filter(pd -> Objects.nonNull(pd.getReadMethod()))

      .collect(Collectors.toMap(

        // bean property name

        PropertyDescriptor::getName,

        pd -> { // invoke method to get value

            try { 

                return pd.getReadMethod().invoke(bean);

            } catch (Exception e) {

                // replace this with better error handling

               return null;

            }

        }));

  } catch (IntrospectionException e) {

    // and this, too

    return Collections.emptyMap();

  }

}

不过,您可能想使错误处理更可靠。很抱歉,已检查的异常阻止我们在此无法正常运行。


事实证明Collectors.toMap()讨厌空值。这是上述代码的更命令性版本:


public static Map<String, Object> beanProperties(Object bean) {

    try {

        Map<String, Object> map = new HashMap<>();

        Arrays.asList(Introspector.getBeanInfo(bean.getClass(), Object.class)

                                  .getPropertyDescriptors())

              .stream()

              // filter out properties with setters only

              .filter(pd -> Objects.nonNull(pd.getReadMethod()))

              .forEach(pd -> { // invoke method to get value

                  try {

                      Object value = pd.getReadMethod().invoke(bean);

                      if (value != null) {

                          map.put(pd.getName(), value);

                      }

                  } catch (Exception e) {

                      // add proper error handling here

                  }

              });

        return map;

    } catch (IntrospectionException e) {

        // and here, too

        return Collections.emptyMap();

    }

}

使用JavaSlang,以更简洁的方式提供了相同的功能:


public static Map<String, Object> javaSlangBeanProperties(Object bean) {

    try {

        return Stream.of(Introspector.getBeanInfo(bean.getClass(), Object.class)

                                     .getPropertyDescriptors())

                     .filter(pd -> pd.getReadMethod() != null)

                     .toJavaMap(pd -> {

                         try {

                             return new Tuple2<>(

                                     pd.getName(),

                                     pd.getReadMethod().invoke(bean));

                         } catch (Exception e) {

                             throw new IllegalStateException();

                         }

                     });

    } catch (IntrospectionException e) {

        throw new IllegalStateException();


    }

}

这是番石榴的版本:


public static Map<String, Object> guavaBeanProperties(Object bean) {

    Object NULL = new Object();

    try {

        return Maps.transformValues(

                Arrays.stream(

                        Introspector.getBeanInfo(bean.getClass(), Object.class)

                                    .getPropertyDescriptors())

                      .filter(pd -> Objects.nonNull(pd.getReadMethod()))

                      .collect(ImmutableMap::<String, Object>builder,

                               (builder, pd) -> {

                                   try {

                                       Object result = pd.getReadMethod()

                                                         .invoke(bean);

                                       builder.put(pd.getName(),

                                                   firstNonNull(result, NULL));

                                   } catch (Exception e) {

                                       throw propagate(e);

                                   }

                               },

                               (left, right) -> left.putAll(right.build()))

                      .build(), v -> v == NULL ? null : v);

    } catch (IntrospectionException e) {

        throw propagate(e);

    }

}


查看完整回答
反对 回复 2019-12-20
?
慕斯王

TA贡献1864条经验 获得超2个赞

// Get the Class object associated with this class.

    MyClass myClass= new MyClass ();

    Class objClass= myClass.getClass();


    // Get the public methods associated with this class.

    Method[] methods = objClass.getMethods();

    for (Method method:methods)

    {

        System.out.println("Public method found: " +  method.toString());

    }


查看完整回答
反对 回复 2019-12-20
  • 3 回答
  • 0 关注
  • 599 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信