如何使用BeanUtils introspection获取Java对象的所有属性列表?

15

我有一个方法,它的参数是一个POJO。现在我想以程序化的方式获取POJO的所有属性(因为我的代码在运行时可能不知道它都有哪些属性),并需要获取属性的值。最后,我将形成一个POJO的字符串表示。

我可以使用ToStringBuilder,但我想按照我特定要求的某种格式构建输出字符串。

在Beanutils中是否有可能这样做呢?如果有,能否提供方法名称的指针?如果没有,我应该编写自己的反射代码吗?


你可以使用ToStringStyle,它具有预定义的样式 DEFAULT_STYLE:默认的toString样式。 MULTI_LINE_STYLE:多行toString样式。 NO_FIELD_NAMES_STYLE:无字段名称的toString样式。 SHORT_PREFIX_STYLE:短前缀toString样式。 SIMPLE_STYLE:简单的toString样式。看看这些是否能解决你的问题。 - Rakesh Juyal
3个回答

18

我知道这是一个一年前的问题,但我认为它对他人可能有用。

我使用这个LOC找到了一个部分解决方案。

Field [] attributes =  MyBeanClass.class.getDeclaredFields();

这里是一个可运行的示例:

import java.lang.reflect.Field;

import org.apache.commons.beanutils.PropertyUtils;

public class ObjectWithSomeProperties {

    private String firstProperty;

    private String secondProperty;


    public String getFirstProperty() {
        return firstProperty;
    }

    public void setFirstProperty(String firstProperty) {
        this.firstProperty = firstProperty;
    }

    public String getSecondProperty() {
        return secondProperty;
    }

    public void setSecondProperty(String secondProperty) {
        this.secondProperty = secondProperty;
    }

    public static void main(String[] args) {

        ObjectWithSomeProperties object = new ObjectWithSomeProperties();

        // Load all fields in the class (private included)
        Field [] attributes =  object.getClass().getDeclaredFields();

        for (Field field : attributes) {
            // Dynamically read Attribute Name
            System.out.println("ATTRIBUTE NAME: " + field.getName());

            try {
                // Dynamically set Attribute Value
                PropertyUtils.setSimpleProperty(object, field.getName(), "A VALUE");
                System.out.println("ATTRIBUTE VALUE: " + PropertyUtils.getSimpleProperty(object, field.getName()));
            } catch (Exception e) {
                e.printStackTrace();
            }

        }
    }
}

12

是的。它给了我我的POJO的字符串表示形式。但是,我希望字符串格式以不同的风格显示。例如,我想让字符串变为“[name=foo;desc=bar;]”,而不是“com.demo.MyPojo@a33425[name=foo,desc=bar]”。 - Veera
也许是这个版本:http://commons.apache.org/lang/api-release/org/apache/commons/lang/builder/ReflectionToStringBuilder.html#toString(java.lang.Object,%20org.apache.commons.lang.builder.ToStringStyle) - John Meagher
哦,上面的链接复制得不正确。有一个版本可以接受对象和ToStringStyle参数,这样您就可以自定义输出了。 - John Meagher

3

使用反射获取所有属性/变量(仅名称),然后使用getProperty方法获取该变量的值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接