我需要检查一个类的成员变量是否在列表中。为此,我需要动态获取一个类的所有变量(如果可能的话作为一个列表)。java中有没有这样的方法?
谢谢,
KD
这就是反射的概念。您应该能够执行以下(未经测试)代码片段之类的操作:
/**
* @return {@code true} if all of the values of the fields in {@code obj} are
* contained in the set of {@code values}; {@code false} otherwise.
*/
public boolean containsAllValues(HashSet<Object> values, MyClass obj) {
Field[] fields = MyClass.class.getFields();
for (Field field : fields) {
Object fieldValue = field.get(obj);
if (values.contains(fieldValue)) {
return false;
}
}
return true;
}
您可以通过调用获取所有字段名称(及其值)Class#getFields()
示例:考虑下面的类
public class Test{
public int x, y, z;
}
Test.class.getFields()
将返回字段x
, y
, z
,您可以在其中获取它们的名称Field#getName()
并通过调用适当的get
方法获取它们的值。在上面的Test
课程中,您可以执行以下操作:
Test instance = new Test();
instance.x = 50;
int xValue = Test.class.getField("x").getInt(instance);
的值为xValue
50。
为了更好地演示它是如何工作的,请看这个。
你在谈论反射。
看看 Class.getFields():
http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html
也可以看看:
有相当多的带反射的鱼钩。基于属性的访问——getX()/setX() 或isX()/setX() 形式的bean 属性——在帮助您避免类内部不稳定的实现方面可能会更好一些。
大多数答案推荐Class.getFields()但正如 JavaDoc 所述,它只会返回公共字段:
返回一个包含 Field 对象的数组,该数组反映了此 Class 对象表示的类或接口的所有可访问公共字段。
我很少将我的类字段公开,而是使用 getter 和 setter 将它们设为私有。要获取所有字段的列表(包括私有、受保护和包私有),您需要使用 Class.getDeclaredFields():
返回一个 Field 对象数组,反映由此 Class 对象表示的类或接口声明的所有字段。这包括公共、受保护、默认(包)访问和私有字段,但不包括继承的字段。
请注意,与 Class.getFields() 不同,Class.getDeclaredFields() 不会返回继承的字段。要获得这些,您需要遍历类层次结构(遍历 Class.getSuperclass() 直到到达 Object.class)。私有字段名称可以在父类中重复。
您可以使用该getFields()
方法,该方法将返回一个Field
数组:http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#getFields()
然后获取名称getName()
中每个元素的方法: http://docs.oracle.com/javase/7/docs/api/java/lang/reflect/Field.html#getName()。Field[]