临摹微笑
不要使用正则表达式,请使用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); }}