如何将对象的所有字段值作为字符串数组?

时间:2014-02-20 18:35:07

标签: java guava opencsv

我有3个大域类,如下所示,我需要将它们的值作为字符串数组,如示例所示。

像这样一个接一个地写所有字段非常耗时且容易出错,有没有快速的方法呢?它将遍历所有字段并获取其字符串值吗?

也许用番石榴或反射?

Class Cart1{


 //Domain class with 100s of Items with getters and setters
 //..


 public String[] toStringArray() {

    return new String[]{
            nullToEmpty(String.valueOf(getSomeItem1())),
            nullToEmpty(String.valueOf(getOtherItem2())),
            .
            .  
            nullToEmpty(String.valueOf(getSomeFreakItem100())),

 }
}

编辑:我需要这个用于opencvs,它需要一个String [],如下例所示:

How to use opencsv with my collection (list)?

3 个答案:

答案 0 :(得分:2)

您可以使用Introspector以编程方式从POJO中读取值

public String[] toStringArray() {
    PropertyDescriptor[] propertyDescriptors = Introspector.getBeanInfo(getClass()).getPropertyDescriptors();
    List<String> values = new ArrayList<String>();
    for (PropertyDescriptor descriptor : propertyDescriptors) {
        Method readMethod = descriptor.getReadMethod();
        if (!readMethod.getName().equals("getClass")) {
            values.add(nullToEmpty((String) readMethod.invoke(this)));
        }
    }
    return values.toArray(new String[0]);
}

答案 1 :(得分:1)

Field[] fields = Cart1.getDeclaredFields();
String[] fieldNames = new String[fields.length];
for (int i= 0; i < fields.length; i++) {
    fieldNames[i] = fields[i].getName();
}

答案 2 :(得分:1)

使用Java反射,您可以使用类似下面的内容。从类中获取所有getter方法(getClass()除外),然后在该类的实例上调用它们并打包成数组。

或者,您可以考虑为数据使用其他数据结构。例如。映射,项目名称作为地图键,项目值作为地图值。

public String[] toStringArray(Cart cart) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
    List<Method> getters = getGetters(cart.getClass());
    String[] result = new String[getters.size()];
    for (int i = 0; i < getters.size(); i++) {
        Object value = getters.get(i).invoke(cart);
        result[i] = String.valueOf(value);
    }
    return result;
}

private List<Method> getGetters(Class clazz) throws SecurityException {
    List<Method> getters = new ArrayList<Method>();

    for (Method method : clazz.getMethods()) {
        if (method.getName().startsWith("get") && !"getClass".equals(method.getName())) {
            getters.add(method);
        }
    }
    return getters;
}