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

Java 如何将所有字段值作为字符串数组获取对象?,java,guava,opencsv,Java,Guava,Opencsv,我有3个大的域类,如下所示,我需要它们的值作为字符串数组,如示例中所示 像这样一个接一个地写所有字段非常耗时而且容易出错,有没有快速的方法?它将遍历所有字段并获取它们的字符串值 也许加番石榴或者倒影 Class Cart1{ //Domain class with 100s of Items with getters and setters //.. public String[] toStringArray() { return new String[]{

我有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,它需要一个字符串[],如本例所示:

Field[]fields=Cart1.getDeclaredFields();
String[]fieldNames=新字符串[fields.length];
for(int i=0;i
您可以使用从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]);
}
public String[]toStringArray(){
PropertyDescriptor[]propertyDescriptors=Introspector.getBeanInfo(getClass()).getPropertyDescriptors();
列表值=新的ArrayList();
for(PropertyDescriptor描述符:propertyDescriptors){
方法readMethod=descriptor.getReadMethod();
如果(!readMethod.getName().equals(“getClass”)){
add(nullToEmpty((String)readMethod.invoke(this));
}
}
返回值.toArray(新字符串[0]);
}

对于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;
}
public String[]toStringArray(购物车)抛出IllegalAccessException、IllegalArgumentException、InvocationTargetException{
List getters=getGetters(cart.getClass());
字符串[]结果=新字符串[getters.size()];
对于(int i=0;i
您可以尝试,它有一个将为给定对象生成属性名->值的映射(假定存在bean样式的getter/setter)。您还可以使用反射(或BeanUtils中的一些较低级别的实用程序)滚动自己的,可以选择使用自定义注释进行更多控制(例如,标记要包含/排除的属性,在结果字符串数组中指定它们的索引等)。您是否需要这样做似乎是可疑的。听起来这些应该保存在
映射
或其他一些大容量数据结构中,而不是作为一个对象中的字段一起保存。@Louis Wasserman我使用opencvs,希望有一个字符串[]……你有更好的主意吗?我不反对
字符串[]
,我担心的是这些东西不在
字符串[]中
或以某种集合类型开头。@Louis Wasserman它在DBA中表示一个表,我将如何使用它?好的,我的字段名在一个列表中,但我需要能够以字符串数组的形式获取这些字段的所有值。你是指对象的字符串表示吗?我想他指的是字段的值,而不仅仅是字段的名称。为此,您必须具有
对象值=字段[i]。获取(购物车)
可能允许
“is”
以及
“get”
;布尔型getter的命名约定是
isXxx
,而不是
getXxx
。另外,我想知道是否值得检查参数类型(
.length==0
)和返回类型(
.equals(Void.class)
)@Jakub Godoniuk tnx我使用opencvs,并期望得到一个字符串[]……您有没有办法在不进行反射的情况下执行此操作?@Spring,在您的问题中,您特别指定了“反射”作为选项。在得到满足您要求的答案后,更改要求最多被认为是不礼貌的。考虑进一步提出一个新问题refinement@Ray并不是说我会从你身上学会如何举止但如果这是你最担心的问题我会接受你的回答要求没有改变我是在问小心点attitude@Spring,我没有提供答案;这对我没有好处
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;
}