#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(", "));
}