2010-01-24 58 views
63

我有一个类,我想找到它的所有公共变量(不是函数)。我怎么能这样做? 谢谢!java:获得一个类中的所有变量名称

+0

您应该可以使用[反射API](http://java.sun.com/docs/books/tutorial/reflect/)完成此操作。 – Crozin 2010-01-24 10:41:20

回答

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

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

getFields()返回全班级的字段 - heirarcy。如果你想有只在相关的类定义的字段,而不是它的超类,使用getDeclaredFields(),并用以下Modifier方法筛选public的:

Modifier.isPublic(field.getModifiers()); 

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

上面的Field类是java.lang.reflect.Field。你可以看看整个java.lang.reflect包。

+2

只是一个笔记 - 最初我的答案包含一个错误的陈述,但它已被多次提高。请仔细阅读;) – Bozho 2010-01-24 11:17:06

+1

@downvoter - 错误是之前。如果您现在看到一个,请分享。 – Bozho 2010-01-25 00:23:21

+0

这个解决方案很慢吗?或者我们可以自由使用它吗? – 2012-12-27 10:12:43

1

正如一些网友提到,下面的代码可以帮助找到一个给定类的所有字段。

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)); 
    } 
} 

但是更有趣的方法是如下:

与杰克逊库的帮助,我能找到一个地图类类型的字符串/整数/双,以及相应的值的所有类属性。 (不使用反射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()); 
    } 
} 
3

您可以使用根据您的需要任意两个:

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()); 
相关问题