Java:获取类中的所有变量名


91

我有一个类,我想找到它的所有公共字段(不是方法)。我怎样才能做到这一点?

谢谢!


您应该能够使用Reflection API做到这一点。
Crozin

Answers:


134
Field[] fields = YourClassName.class.getFields();

返回该类的所有公共变量的数组。

getFields()返回整个类继承中的字段。如果要仅在相关类中定义字段,而不是在其超类中定义,请使用getDeclaredFields(),并public通过以下Modifier方法过滤它们:

Modifier.isPublic(field.getModifiers());

YourClassName.class字面实际上代表类型的对象java.lang.Class。检查其文档以获取更多有趣的反射方法。

Field上面的类是java.lang.reflect.Field。您可以查看整个java.lang.reflect程序包。


2
只是一个注释-最初我的回答包含错误的陈述,但被多次否决。请仔细阅读;)
Bozho 2010年

1
@downvoter-错误是以前的。如果现在看到一个,请分享。
博佐

这个解决方案慢吗?还是我们可以自由使用它?
Dany Y

没关系。但是不要过度使用它。
博佐2012年


15

您可以根据需要使用两者之一:

Field[] fields = ClassName.class.getFields(); // returns inherited members but not private members.
Field[] fields = ClassName.class.getDeclaredFields(); // returns all members including private members but not inherited members.

要仅从上面的列表中过滤公共字段(根据需要),请使用以下代码:

List<Field> fieldList = Arrays.asList(fields).stream().filter(field -> Modifier.isPublic(field.getModifiers())).collect(
    Collectors.toList());

2

很少有人提到,下面的代码可以帮助查找给定类中的所有字段。

TestClass testObject= new TestClass().getClass();
Method[] methods = testObject.getMethods();
for (Method method:methods)
{
    String name=method.getName();
    if(name.startsWith("get"))
    {
        System.out.println(name.substring(3));
    }else if(name.startsWith("is"))
    {
        System.out.println(name.substring(2));
    }
}

但是,下面是一个更有趣的方法:

借助Jackson库,我能够找到String / integer / double类型的所有类属性,以及Map类中的各个值。(不使用反射API!

TestClass testObject = new TestClass();
com.fasterxml.jackson.databind.ObjectMapper m = new com.fasterxml.jackson.databind.ObjectMapper();

Map<String,Object> props = m.convertValue(testObject, Map.class);

for(Map.Entry<String, Object> entry : props.entrySet()){
    if(entry.getValue() instanceof String || entry.getValue() instanceof Integer || entry.getValue() instanceof Double){
        System.out.println(entry.getKey() + "-->" + entry.getValue());
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.