繁体   English   中英

如何在给定列表中遍历Java中的Class属性(不反映getDeclaredFields())?

[英]How to loop over a Class attributes in Java - from a given list (NOT reflection getDeclaredFields())?

如何使用列表/数组中提供的属性名称遍历对象的属性- 并非所有属性 ,如使用Reflection& getDeclaredFields()

public class MyClass
{
    public type1 att1;
    public type2 att2;
    public type3 att3;

    public MyClass(
        att1="helo";
        att2="bye";
        att3="morning";
    );

    ...
    public void function()
    {
        String myStrings[];
        myStrings = new String[] { "att2", "att3" };

        MyClass myobject = new MyClass();
        for(var in myStrings)
        {
           System.out.println(var);
           System.out.println(myobject.var);
           System.out.println();
        }
    }
}

您可能想使用一些基于JavaBeans / BeanInfo的技术。 Apache Commons / BeanUtils是一个很好的起点。

请参阅我的先前答案以获取更多信息: https : //stackoverflow.com/a/5856982/342852

但是,如果您只想使用字段而不是bean属性,则可以使用Java 8方法:

public static Map<String, Object> getFieldProperties(Object o, Collection<String> fields) {
  Class<?> type = o.getClass();
  return fields.stream().map(n -> {
    try {
      return type.getDeclaredField(n);
    } catch (NoSuchFieldException e) {
      throw new IllegalStateException(e);
    }
  }).collect(Collectors
    .toMap(
      (Function<Field, String>) Field::getName,
      (Function<Field, Object>) field -> {
        try {
          field.setAccessible(true);
          return field.get(o);
        } catch (IllegalAccessException e) {
          throw new IllegalStateException(e);
        }
    }));
}

不幸的是,检查异常使此操作比需要的更加冗长。

您的问题对于使用反射有点模棱两可。 如果您可以进行反射,但是只希望特定字段而不需要遍历getDeclaredFields() ,那么以下代码将为您工作:

for (String var : myStrings) {
    Field field = MyClass.class.getDeclaredField(var);
    field.setAccessible(true);
    System.out.println(var);
    System.out.println(field.get(myObject));
    System.out.println();
}

请注意,此代码也适用于私有字段。 另外,请记住,您必须处理与反射调用关联的异常。

UPDATE :此代码中引发异常。

MyClass.class.getDeclaredField(var)声明一个已检查的NoSuchFieldException 您必须处理它,因为显然没有机制可以确保myString中的字段与MyClass的实际实现相匹配。

如果该字段不可访问,则field.get(myObject)抛出一个检查的IllegalAccessException 这不应该是因为field.setAccessible(true) ,但是您仍然必须捕获或重新引发异常。

您可能还需要处理一些未经检查的异常。 有关详细信息,请参见javadoc

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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