1

我需要检查一个类的成员变量是否在列表中。为此,我需要动态获取一个类的所有变量(如果可能的话作为一个列表)。java中有没有这样的方法?

谢谢,
KD

4

5 回答 5

2

这就是反射的概念。您应该能够执行以下(未经测试)代码片段之类的操作:

/**
 * @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;
}
于 2013-08-29T01:52:11.837 回答
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);

的值为xValue50。

为了更好地演示它是如何工作的,请看这个

于 2013-08-29T01:54:18.780 回答
1

你在谈论反射

看看 Class.getFields():

http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html

也可以看看:

http://forgetfulprogrammer.wordpress.com/2011/06/13/java-reflection-class-getfields-and-class-getdeclaredfields/

有相当多的带反射的鱼钩。基于属性的访问——getX()/setX() 或isX()/setX() 形式的bean 属性——在帮助您避免类内部不稳定的实现方面可能会更好一些。

于 2013-08-29T01:51:07.920 回答
0

大多数答案推荐Class.getFields()但正如 JavaDoc 所述,它只会返回公共字段:

返回一个包含 Field 对象的数组,该数组反映了此 Class 对象表示的类或接口的所有可访问公共字段。

我很少将我的类字段公开,而是使用 getter 和 setter 将它们设为私有。要获取所有字段的列表(包括私有、受保护和包私有),您需要使用 Class.getDeclaredFields()

返回一个 Field 对象数组,反映由此 Class 对象表示的类或接口声明的所有字段。这包括公共、受保护、默认(包)访问和私有字段,但不包括继承的字段。

请注意,与 Class.getFields() 不同,Class.getDeclaredFields() 不会返回继承的字段。要获得这些,您需要遍历类层次结构(遍历 Class.getSuperclass() 直到到达 Object.class)。私有字段名称可以在父类中重复。

于 2013-08-29T02:11:11.627 回答
0

您可以使用该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[]

于 2013-08-29T01:53:38.397 回答