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

不要使用正则表达式,请使用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 properties = BeanUtils.describe(yourObject);

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

更新:

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

public static Map 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 beanProperties(Object bean) {

try {

Map 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 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 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::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);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值