我想在User类中获取字段名称数组。例如姓名,年龄
我尝试了以下代码 -
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
Field[] fields = User.class.getDeclaredFields();
ArrayList<Field> utilList = new ArrayList<Field>(Arrays.asList(fields));
System.out.println(utilList);
}
}
class User{
String name;
int age;
}
但它正在打印[java.lang.String prac1.User.name, int prac1.User.age]
。
我需要使用方括号打印[name,age]
而不循环使用它。
可以在之前和之后附加方括号,但这不是我需要它的方式。它应该是独立的。
是否有可能以某种方式使用重写toString
方法?
答案 0 :(得分:4)
遍历utilList
并在每个项目上调用Field.getName。
答案 1 :(得分:2)
如果您使用的是Java 8,那么您可以利用功能特性使用地图功能将列表映射到新列表:
List<String> mapped = utilList.stream().map(field -> field.getName()).collect(Collectors.toList());
或
String[] mapped = utilList.stream().map(field -> field.getName()).toArray();
答案 2 :(得分:1)
ArrayList<String> utilList = new ArrayList<String>();
for (Field field: fields) {
utilList.add(field.getName());
}
但我没有看到使用utilList ...
的重点答案 3 :(得分:0)
您可以使用getName
的{{1}}方法。
Field
<强>输出强>
Field[] fields = User.class.getDeclaredFields();
for (Field f: fields) {
System.out.println(f.getName());
}
答案 4 :(得分:0)
应该是
Class klass = User.class;
List<String> fieldNames = new ArrayList<String>();
for(Field field: klass.getDeclaredFields()) {
fieldNames.add(field.getName());
}
System.out.println(fieldNames);
答案 5 :(得分:0)
使用正则表达式的解决方案,供参考:
// Class
private static final Pattern FIELD_PATTERN =
Pattern.compile("(?:[\\dA-Za-z\\.]+) (?:[\\dA-Za-z\\.]+)?\\.([A-Za-z]+)");
// Method
{
// ...
Matcher matcher=FIELD_PATTERN.matcher(utilList.toString());
while(matcher.find())
System.out.println(matcher.replaceAll("$1"));
}
你得到:
[姓名,年龄]
请参阅regex explanation并尝试code demo。
哦,你可以用这个构建一个单行:
System.out.println(User.class.getDeclaredFields().toString().replaceAll("(?:[\\dA-Za-z\\.]+) (?:[\\dA-Za-z\\.]+)?\\.([A-Za-z]+)", "$1"));