7

我有一个bean,有没有办法一一列出bean的所有属性而不列出?

一些 bean 覆盖了方便的 ToString() 方法。但是没有覆盖这个方法的bean呢?

4

4 回答 4

10

您可以通过 BeanIntrospection 使用BeanInfo,如下所示:

Object o = new MyBean();
try {
    BeanInfo bi = Introspector.getBeanInfo(MyBean.class);
    PropertyDescriptor[] pds = bi.getPropertyDescriptors();
    for (int i=0; i<pds.length; i++) {
        // Get property name
        String propName = pds[i].getName();

        // Get the value of prop1
        Expression expr = new Expression(o, "getProp1", new Object[0]);
        expr.execute();
        String s = (String)expr.getValue();
    }
    // class, prop1, prop2, PROP3
} catch (java.beans.IntrospectionException e) {
}

或者您可以使用以下方法之一使用反射方法:

  1. 通过getDeclaredMethods获取所有无参数getXXX()方法并遍历
  2. 使用 getDeclaredFields() 获取所有字段并遍历它们(不符合 Bean 规范,如果你关心的话)
于 2012-05-26T09:16:32.037 回答
4

请参阅 apache commons lang - ReflectionToStringBuilder

于 2012-05-26T09:25:00.657 回答
2

您可以使用反射。从类中获取声明的字段,它们是私有的,检查它们是否有 setter 和 getter(记住布尔 getter 是“isProperty”)

代码可能如下所示:

List<String> properties = new ArrayList<String>();
Class<?> cl = MyBean.class;

// check all declared fields
for (Field field : cl.getDeclaredFields()) {

    // if field is private then look for setters/getters
    if (Modifier.isPrivate(field.getModifiers())) {

        // changing 1st letter to upper case
        String name = field.getName();
        String upperCaseName = name.substring(0, 1).toUpperCase()
                + name.substring(1);
        // and have getter and setter
        try {
            String simpleType = field.getType().getSimpleName();
            //for boolean property methods should be isProperty and setProperty(propertyType)
            if (simpleType.equals("Boolean") || simpleType.equals("boolean")) {
                if ((cl.getDeclaredMethod("is" + upperCaseName) != null)
                        && (cl.getDeclaredMethod("set" + upperCaseName,
                                field.getType()) != null)) {
                    properties.add(name);
                }
            } 
            //for not boolean property methods should be getProperty and setProperty(propertyType)
            else {
                if ((cl.getDeclaredMethod("get" + upperCaseName) != null)
                        && (cl.getDeclaredMethod("set" + upperCaseName,
                                field.getType()) != null)) {
                    properties.add(name);
                }
            }
        } catch (NoSuchMethodException | SecurityException e) {
            // if there is no method nothing bad will happen
        }
    }
}
for (String property:properties)
    System.out.println(property);
于 2012-05-26T09:57:57.940 回答
0

您可能对BeanInfo感兴趣,这是一个可能伴随 bean 类的类,而无需更改 bean 类。它在许多 GUI 构建器中用于显示 bean 的属性,但也有其非 GUI 用途。

于 2012-05-26T09:42:50.903 回答