我有一个bean,有没有办法在没有列表的情况下逐个列出bean的所有属性?
一些bean覆盖ToString()方法,这很方便。没有覆盖这种方法的豆子怎么样?
答案 0 :(得分:7)
您可以通过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 :(得分:3)
参见apache commons lang - ReflectionToStringBuilder
答案 2 :(得分:2)
您可以使用反射。从类中获取声明的字段,如果它们有setter和getter则它们是私有的(请记住boolean 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);
答案 3 :(得分:0)
您可能对BeanInfo感兴趣,这是一个可能伴随bean类的类,而不需要更改bean类。它在许多GUI构建器中用于显示bean的属性,但也有非GUI使用。