我有一个类,我想找到所有的公共变量(不是函数)。我怎么能这样做? 谢谢!
答案 0 :(得分:120)
Field[] fields = YourClassName.class.getFields();
返回该类的所有公共变量的数组。
getFields()
返回整个班级的字段 - heirarcy。如果您希望仅在相关类中定义字段,而不是其超类,请使用getDeclaredFields()
,并使用以下public
方法过滤Modifier
个字段:
Modifier.isPublic(field.getModifiers());
YourClassName.class
文字实际上代表java.lang.Class
类型的对象。检查其文档以获得更有趣的反射方法。
上面的Field
课程为java.lang.reflect.Field
。您可以查看整个java.lang.reflect
包。
答案 1 :(得分:33)
https://docs.oracle.com/javase/tutorial/reflect/class/classMembers.html。还有用于定位方法和构造函数的图表。
答案 2 :(得分:11)
您可以根据需要使用这两种中的任何一种:
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());
答案 3 :(得分: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());
}
}