Java - список разбора <Field>в строку - PullRequest
2 голосов
/ 12 марта 2019

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

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

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

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

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

    return result;
}

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

[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

Любая помощь, чтобы дать?Используя отражение между прочим.Спасибо.

Ответы [ 4 ]

3 голосов
/ 12 марта 2019

Формат вывода такой же, как у Field class toString, метод реализован как показано ниже:

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

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

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

String s = result.stream().map(e -> e.getDeclaringClass().getSimpleName()).collect(Collectors.joining(", "));
System.out.println(s);
3 голосов
/ 12 марта 2019

Вы хотите выводить только каждый тип Field, так что:

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

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

String types = result.stream().map(e->e.getType().getSimpleName()).collect(Collectors.joining(","));
2 голосов
/ 12 марта 2019

Вы можете использовать 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, String, int]

2 голосов
/ 12 марта 2019

Вы можете использовать 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 && i != Object.class) {
        Collections.addAll(result, i.getDeclaredFields());
        i = i.getSuperclass();
    }

    return result.stream()
                 .map(field -> field.getType().getSimpleName())
                 .collect(Collectors.joining(", "));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...