我需要检查类的成员变量是否在列表中。为此,我需要动态获取类的所有变量(如果可能的话,作为列表)。在java中是否有方法?
谢谢,
KD
答案 0 :(得分:2)
这是Reflection的概念。您应该能够执行以下(未经测试的)代码段:
/**
* @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;
}
答案 1 :(得分:2)
您可以通过调用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。
为了更好地演示其工作原理,请参阅this。
答案 2 :(得分:1)
你在谈论反思。
看一下Class.getFields():
http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html
另见:
有很多带有反射的鱼钩。基于属性的访问 - 形式为getX()/ setX()或isX()/ setX()的bean属性 - 可以更好地帮助您避免类内部的不稳定实现。
答案 3 :(得分:0)
您可以使用getFields()
方法,该方法将返回Field
数组:http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#getFields()
然后getName()
中每个元素的Field[]
方法获取名称:http://docs.oracle.com/javase/7/docs/api/java/lang/reflect/Field.html#getName()。
答案 4 :(得分:0)
大多数答案都推荐Class.getFields(),但正如JavaDoc所述,它只会返回公共字段:
返回一个包含反映所有内容的Field对象的数组 由此表示的类或接口的可访问公共字段 类对象。
我很少将我的课程字段公开,而是将其与getter和setter私密化。要获取所有字段的列表(包括私有,受保护和包私有),您需要使用Class.getDeclaredFields():
返回反映声明的所有字段的Field对象数组 由此Class对象表示的类或接口。这个 包括公共,受保护,默认(包)访问和私有 字段,但不包括继承的字段。
请注意,与Class.getFields()不同,Class.getDeclaredFields()不会返回继承的字段。获取那些需要循环遍历类层次结构的循环(循环遍历Class.getSuperclass(),直到到达Object.class)。私有字段名称可以在父类中重复。