在java中是否有一个返回类的成员变量的方法

时间:2013-08-29 01:46:43

标签: java

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

谢谢,
KD

5 个答案:

答案 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()将返回字段xyz,您可以在其中通过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

另见:

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

有很多带有反射的鱼钩。基于属性的访问 - 形式为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)。私有字段名称可以在父类中重复。