Java — Преобразовать список в строку

#java #spring #reflection

#java #spring #отражение

Вопрос:

Я пытаюсь превратить List<Field> в простые строки, но я не уверен, как преобразовать их из массива в одну String переменную.

В настоящее время я использую метод, который проходит через класс, использующий getDeclaredFields() метод, и выводит их в массив.

 public static List<Field> getInheritedPrivateFields(Class<?> type) {
    List<Field> result = new ArrayList<Field>();

    Class<?> i = type;
    while (i != null amp;amp; i != Object.class) {
        Collections.addAll(result, i.getDeclaredFields());
        i = i.getSuperclass();
    }

    for(Field temp : result) {
        System.out.println(temp);
    }

    return resu<
}
  

Результат, который я получаю при его выводе, является

 [private int com.gen.e.ric.report.domain.TestCount.count,
 private java.lang.String com.gen.e.ric.report.domain.Test.facility, 
 private java.lang.String com.gen.e.ric.report.domain.Test.technology,
 private java.lang.String com.gen.e.ric.report.domain.Test.component, 
 private java.util.List com.gen.e.ric.report.domain.Test.etestStats, 
 private java.util.Date com.gen.e.ric.report.domain.Test.startDate, 
 private java.util.Date com.gen.e.ric.report.domain.Test.endDate]
  

То, что я хочу получить, это просто длинная строка с

 int, String, String, List, Date, Date
  

Какая-либо помощь может быть оказана? Кстати, используя отражение.
Спасибо.

Комментарии:

1. Вы можете использовать toString() метод для преобразования ваших полей в строку.

2. @Maxouille это то, что уже происходит, когда он звонит System.out.println(temp); .

3. @f1sh Я согласен, но я не понимаю, о чем здесь на самом деле спрашивают. Нужны ли нам только такие значения, как facility , technology и т.д., В виде строки или List<String> содержащей тип атрибутов, или объединенной строки со всеми типами? ?

4. @Maxouille читать What I want to get is just a long string with

5. @f1sh мой плохой -_- srry

Ответ №1:

Вы хотите выводить только каждый Field тип, поэтому сделайте это:

 for(Field temp : result) {
    System.out.println(temp.getType());
}
  

или для того, чтобы поместить его в String :

 String types = result.stream().map(e->e.getType().getSimpleName()).collect(Collectors.joining(","));
  

Ответ №2:

Формат вывода аналогичен методу Field класса toString , реализованному следующим образом:

 public String toString() {
    int mod = getModifiers();
    return (((mod == 0) ? "" : (Modifier.toString(mod)   " "))
          getType().getTypeName()   " "
          getDeclaringClass().getTypeName()   "."
          getName());
}
  

Примечание: Class amp; Field оба класса являются final , поэтому вы can't override
это также.

Таким образом, вы не можете изменить определение поля toString . Но что вы можете создать свою собственную строку, как показано ниже:

 String s = result.stream().map(e -> e.getDeclaringClass().getSimpleName()).collect(Collectors.joining(", "));
System.out.println(s);
  

Ответ №3:

Вы можете использовать Field.getType() для получения Class из Field , затем использовать Class.getSimpleName() для получения только той части, которую вы хотите :

 List<String> types = new ArrayList<>();
Field[] declaredFields = Person.class.getDeclaredFields();
for (Field declaredField : declaredFields) {
    // Will give [class java.lang.String, class java.lang.String, int]
    // types.add(declaredField.getType().toString()); 

    // Will give [String, String, int]
    types.add(declaredField.getType().getSimpleName()); 
}
System.out.println(types);
  

[Строка, String, int]

Ответ №4:

Вы можете воспользоваться getSimpleName() . Например:

 String.class.getSimpleName();
  

В вашем примере все, что вам нужно сделать, это :

 for (Field temp : result) {
    System.out.println(temp.getType().getSimpleName());
}
  

Итак, ваш метод теперь будет выглядеть следующим образом :

 public static String getInheritedPrivateFields(Class<?> type) {
    List<Field> result = new ArrayList<Field>();

    Class<?> i = type;
    while (i != null amp;amp; i != Object.class) {
        Collections.addAll(result, i.getDeclaredFields());
        i = i.getSuperclass();
    }

    return result.stream()
                 .map(field -> field.getType().getSimpleName())
                 .collect(Collectors.joining(", "));
}