我有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 [],如下例所示:
答案 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;
}