1

我在 Windows 7 上使用 Netbeans 7.2.1。

我正在尝试获取实体的所有属性并将它们存储在字符串数组中。我想以我能想到的最一般的方式来做到这一点,所以像 jCSV 中的方法:

public void writeAll(List<E> data) throws IOException {
    for (E e : data) {
        write(e);
    }
}

你可以在这里找到那个包:https ://code.google.com/p/jcsv/

public String[] getProperties( E e ){

    String [] properties = new String[ e.numberOfProperties ];
    int i = -1;

    for ( P p : e ) {

        i += 1;
        properties[i] = p.toString(); // OR properties[i] = e.getProperty[i].toString();

    }

    return properties;
}

我觉得应该有某种方法可以使用Properties 类来做到这一点,但我想不出一种方法来使用它实体中获取属性。我认为这只是一些简单的事情,但我看不出在哪里。

4

1 回答 1

1

正如@Ian Roberts 提到的,在这里查看 java Introspector 类。仅当您使用标准 Java bean 命名约定来访问实体的属性时,该类才有用。

您要做的是使用方法获取BeanInfo类的 ,Introspector#getBeanInfo(Class beanClass)然后使用 的getMethodDescriptors()方法BeanInfo检索 bean 的所有“getter”方法。从那里您可以遍历它们并获取实体的属性并调用toString()它们。

与仅使用普通的旧反射相比,使用此类的优点之一是,它会BeanInfo在对其进行自省后缓存该类,从而提高性能。您也不必对反射代码之类的getset在反射代码中的任何内容进行硬编码。

getProperties这是使用内省器的方法的示例:

public <T> String[] getProperties(T entity){
    String[] properties = null;
    try {
        BeanInfo entityInfo = Introspector.getBeanInfo(entity.getClass());
        PropertyDescriptor[] propertyDescriptors = entityInfo.getPropertyDescriptors();
        properties = new String[propertyDescriptors.length];
        for(int i = 0 ; i < propertyDescriptors.length ; i++){
            Object propertyValue = propertyDescriptors[i].getReadMethod().invoke(entity);
            if(propertyValue != null){
                properties[i] = propertyValue.toString();
            } else {
                properties[i] = null;
            }
        }
    } catch (Exception e){
        //Handle your exception here.
    }
    return properties;
}

此示例编译并运行。

请记住,Apache Commons 也有一个库BeanUtils,它对这类事情也很有帮助(Javadoc here)。

于 2013-02-27T12:48:38.000 回答