![](/img/trans.png)
[英]Java Reflection: GetDeclaredFields() method call in inherited class from super class
[英]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
java.lang.reflect.Field
(boolean)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.