如何遍历Java中的Class属性?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (18)

我怎样才能动态地在java中循环一个类的​​属性。

例如:

public class MyClass
{
private type1 att1;
private type2 att2;
...
public void function()
{
    for(var in MyClass.Attributes)
    {
       System.out.println(var.class);
    }
}

}

这在Java中可能吗?

提问于
用户回答回答于

没有语言支持去做你想要的东西。

你可以在运行时使用反射(例如Class.getDeclaredFields()获取数组Field)来反射性地访问类型的成员,但取决于你想要做什么,这可能不是最好的解决方案。

也可以看看

  • Java教程:反射API / 高级语言主题:反思

相关问题

  • 什么是反思,为什么它有用?
  • Java反思:为什么这么糟糕?
  • Reflection如何不会导致代码味道?
  • 转储Java对象的属性

下面是一个简单的例子,只显示一些反射能够做的事情。

import java.lang.reflect.*;

public class DumpFields {
    public static void main(String[] args) {
        inspect(String.class);
    }
    static <T> void inspect(Class<T> klazz) {
        Field[] fields = klazz.getDeclaredFields();
        System.out.printf("%d fields:%n", fields.length);
        for (Field field : fields) {
            System.out.printf("%s %s %s%n",
                Modifier.toString(field.getModifiers()),
                field.getType().getSimpleName(),
                field.getName()
            );
        }
    }
}

上面的代码片段使用反射来检查所有已声明的字段class String; 它会产生以下输出:

7 fields:
private final char[] value
private final int offset
private final int count
private int hash
private static final long serialVersionUID
private static final ObjectStreamField[] serialPersistentFields
public static final Comparator CASE_INSENSITIVE_ORDER

有效的Java第2版,第53项:优先考虑反思接口

这些是本书的摘录:

给定一个Class对象,你可以获取ConstructorMethod以及Field代表类的构造函数,方法和字段的实例。[他们]可以让你反思性地操纵他们的基础同行。然而,这种力量的代价是:

  • 您失去了编译时检查的所有好处。
  • 执行反射访问所需的代码笨拙而冗长。
  • 性能受损。

通常,运行时不应在正常应用程序中反射访问对象。 有一些需要反思的复杂应用程序。例子包括[......故意忽略...]如果您对您的应用程序是否属于这些类别之一有任何疑问,则可能不会。

用户回答回答于

直接访问字段在java中不是很好的风格。我建议为bean的字段创建getter和setter方法,然后使用java.beans包中的Introspector和BeanInfo类。

MyBean bean = new MyBean();
BeanInfo beanInfo = Introspector.getBeanInfo(MyBean.class);
for (PropertyDescriptor propertyDesc : beanInfo.getPropertyDescriptors()) {
    String propertyName = propertyDesc.getName();
    Object value = propertyDesc.getReadMethod().invoke(bean);
}

扫码关注云+社区