Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to list the bean's properties

Tags:

java

I have a bean, is there a way to list bean's all properties without list one by one?

Some beans overide the ToString() method which is handy. Howvere the beans which does not override this method?

like image 200
Adam Lee Avatar asked May 26 '12 09:05

Adam Lee


3 Answers

You can use BeanInfo via BeanIntrospection as follows:

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) {
}

Or you can go with reflection method using one of the following approaches:

  1. Get all no-parameter getXXX() methods through getDeclaredMethods and traverse them
  2. Get all fields using getDeclaredFields() and traverse them (Not compliant with Bean spec, if you care about it)
like image 160
Hakan Serce Avatar answered Sep 23 '22 02:09

Hakan Serce


see apache commons lang - ReflectionToStringBuilder

like image 41
piotrek Avatar answered Sep 24 '22 02:09

piotrek


You can use reflection. Take declared fields from class, it they are private check if they have setters and getters (remember boolean getter is "isProperty")

Code can look like this:

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);
like image 42
Pshemo Avatar answered Sep 27 '22 02:09

Pshemo