如何遍历Java中的Class属性?

我怎样才能动态地在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的对象,就可以获取ConstructorMethodField代表类的构造函数,方法和字段的实例。 [他们]可以让你反思性地操纵他们的基础同行。 然而,这种力量的代价是:

  • 您失去了编译时检查的所有好处。
  • 执行反射访问所需的代码笨拙而冗长。
  • 性能受损。
  • 通常,运行时不应在正常应用程序中反射访问对象。

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


    直接访问字段在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);
    }
    

    虽然我同意Jörn的回答,如果你的类符合JavaBeabs规范,如果不符合,并且你使用Spring,这是一个很好的选择。

    Spring有一个名为ReflectionUtils的类,它提供了一些非常强大的功能,包括doWithFields(class,callback),这是一种访问者风格的方法,可以让你用类似下面的回调对象迭代类字段:

    public void analyze(Object obj){
        ReflectionUtils.doWithFields(obj.getClass(), field -> {
    
            System.out.println("Field name: " + field.getName());
            field.setAccessible(true);
            System.out.println("Field value: "+ field.get(obj));
    
        });
    }
    

    但是,这里有一个警告:班级被标记为“仅供内部使用”,如果你问我,这很遗憾

    链接地址: http://www.djcxy.com/p/47631.html

    上一篇: How to loop over a Class attributes in Java?

    下一篇: Dumping a java object's properties