Создание метода для создания строки CSV формы любого пользовательского типа объекта - универсальный - PullRequest
0 голосов
/ 02 февраля 2019

Можно ли создать метод, который будет зацикливать список любого пользовательского типа объекта, а затем создавать из него строку csv?

Пока у меня есть сигнатура метода, подобная следующей:

loopData(List<T> records){

}

Затем я хотел бы зациклить каждое поле в объекте без необходимости указывать тип объекта.

Пока это то, что я вижу, но, похоже, явно указывается тип объекта, какв классе ABC:

ClassABC abc = new ClassABC();//!!explicitly stating custom object type!!!
for (Field field : abc.getClass().getDeclaredFields()) {
    field.setAccessible(true);
    String name = field.getName();
    Object value = field.get(abc);
    System.out.printf("%s: %s%n", name, value);
}

Есть ли способ добиться этого?Зацикливать каждое поле без явного указания типа объекта?

Как насчет чего-то вроде этого:

for(T o : records){
            for(Field field:o.getClass().getDeclaredFields()) {
                field.setAccessible(true);
                String name = field.getName();
               Object value = null;
               try {
                   value = field.get(o);
               } catch (IllegalArgumentException | IllegalAccessException e) {
                   // TODO Auto-generated catch block
                   e.printStackTrace();
               }
               System.out.printf("%s: %s%n", name, value);
            }
}

Является ли этот цикл согласованным?будет ли он каждый раз повторять поля объекта в одном и том же порядке?

1 Ответ

0 голосов
/ 07 февраля 2019

В конце концов, это то, что работает ...

Я могу получить имена полей и отправить их DOMO для создания, например так:

    List<Column> domoColumns = new ArrayList<Column>();
            for(Field field:o.getClass().getDeclaredFields()) {
                field.setAccessible(true);
                String name = field.getName();
                domoColumns.add(new Column(ColumnType.STRING,name));
            }
return domoColumns;

Затем я создаю CSVвот так:

StringBuilder stringBuilder = new StringBuilder();
    for (T o : records) {

        int numberOfFields = o.getClass().getDeclaredFields().length;
        int counter = 1;

        Field[] f = o.getClass().getDeclaredFields();
        for (int i = 0; i < o.getClass().getDeclaredFields().length; i++) {
            f[i].setAccessible(true);
            Object value = null;
            try {
                value = f[i].get(o);

                if (counter < numberOfFields) {
                    stringBuilder.append("\"").append(value).append("\"").append(",");
                } else {
                    stringBuilder.append("\"").append(value).append("\"").append(System.getProperty("line.separator"));
                }
            } catch (IllegalArgumentException | IllegalAccessException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            counter++;
        }


    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...