Java-将List <field>解析为字符串

时间:2019-03-12 09:19:04

标签: java spring reflection

我正在尝试将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 个答案:

答案 0 :(得分:3)

您只想输出每个Field的类型,所以可以这样做:

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

或为了将其放入String

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

答案 1 :(得分:3)

输出格式类似于FieldtoString方法,其实现方式如下:

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

请注意:Class & Field类都是final,所以您can't override   

因此,您不能更改Field的toString定义。但是,您可以像下面那样构建自己的String:

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

答案 2 :(得分:2)

您可以使用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(", "));
}

答案 3 :(得分:2)

您可以使用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]