繁体   English   中英

Java中是否有一种方法可返回类的成员变量

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

也可以看看:

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

反射中有很多鱼钩。 基于属性的访问(即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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM