[英]Is there a method in java that returns member variables of a class
我需要检查一个类的成员变量是否在列表中。 为此,我需要动态获取类的所有变量(如果可能,作为列表)。 在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属性)在帮助您避免类内部的不稳定实现方面可能会更好一些。
您可以使用getFields()
方法,该方法将返回一个Field
数组: http : //docs.oracle.com/javase/7/docs/api/java/lang/Class.html#getFields()
然后使用Field[]
每个元素的getName()
方法获取名称: http : //docs.oracle.com/javase/7/docs/api/java/lang/reflect/Field.html#getName( ) 。
大多数答案都建议使用Class.getFields(),但正如JavaDoc所述,它将仅返回公共字段:
返回一个包含Field对象的数组,该对象反映此Class对象表示的类或接口的所有可访问公共字段。
我很少公开我的课堂领域,而是让他们与getter和setter一起私有。 要获取所有字段的列表(包括私有,受保护和私有包),您需要使用Class.getDeclaredFields() :
返回一个Field对象数组,该数组反映由该Class对象表示的类或接口声明的所有字段。 这包括公共,受保护,默认(程序包)访问和私有字段,但不包括继承的字段。
请注意,与Class.getFields()不同,Class.getDeclaredFields()不会返回继承的字段。 要获取这些内容,您需要遍历类层次结构(遍历Class.getSuperclass()直到到达Object.class)。 专用字段名称可以在父类中重复。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.