可能重复:
Access to private inherited fields via reflection in Java
你好我hava在java反射中遇到init值问题。
我有简单的课程
public class A extends B {
private String name;
}
public class B {
private String superName;
}
我也有简单的功能:
public void createRandom(Class<T> clazz , List<String> classFields){
try {
T object = clazz.newInstance();
for(String s : classFields){
clazz.getDeclaredField(s);
}
} catch(Exception e){
}
}
我的功能做其他的事情,但我有问题,因为我有错误:
java.lang.NoSuchFieldException: superName
如何使用反射设置所有类字段也来自超类?
我有所有类字段(也是继承),我使用的是函数field.set(Object obj, Object value)
但是这样我就无法设置继承的类字段:/
我没有问题得到所有类字段我使用Spring ReflectionUtils.doWithfield。
我将所有字段名称都存储在List<String> classField
中,所以我知道所有的clazz字段也都是继承的。但我的问题是如何将值设置为所有clazz字段。
答案 0 :(得分:7)
如果我不得不猜测,我假设您在A类上调用此方法,并期望能够查看B类中声明的基础字段,如下所示:
A.class.getDeclaredField("superName");
情况并非如此,并会抛出异常(java.lang.NoSuchFieldException
)。 Reflection不会检查超类以查找字段或方法。因为类A
没有定义superName
,所以不会使用这样的反射找到它。但是,您可以修改代码以使其检查所有超类,直到它达到null
作为超类,此时如果仍未找到它,它肯定不存在。
以下是一个例子:
public static Field findUnderlying(Class<?> clazz, String fieldName) {
Class<?> current = clazz;
do {
try {
return current.getDeclaredField(fieldName);
} catch(Exception e) {}
} while((current = current.getSuperclass()) != null);
return null;
}
以下是一个示例电话:findUnderlying(A.class, "superName")
;它首先会检查A类的字段。由于A没有它,因此dowhile会移动到它的超类,即B(不为null,因此继续)。 B确实拥有它,因此它返回该字段。如果B没有它,它将检查Object,然后返回null,因为Object没有超类。
答案 1 :(得分:1)
使用Class.getSuperclass()获取超级课程。然后使用超类,你可以得到它的字段。
答案 2 :(得分:-1)
即使A从B扩展,也不会使用A的实例,这是因为私有成员在子类中不可访问。尝试将superName的访问权限更改为受保护,如果有效...