可能重复:
通过Java中的反射访问私有继承的字段
你好我hava用java反射的init值有问题.
我有简单的课程
public class A extends B {
private String name;
}
public class B {
private String superName;
}
Run Code Online (Sandbox Code Playgroud)
而且我也有简单的功能:
public void createRandom(Class<T> clazz , List<String> classFields){
try {
T object = clazz.newInstance();
for(String s : classFields){
clazz.getDeclaredField(s);
}
} catch(Exception e){
}
}
Run Code Online (Sandbox Code Playgroud)
我的功能做其他的东西,但我有问题,因为我有错误:
java.lang.NoSuchFieldException: superName
Run Code Online (Sandbox Code Playgroud)
如何使用反射从超类设置所有类字段也字段?
我有所有类字段(也继承),我正在使用函数,field.set(Object obj, Object value)但这样我不能设置继承的类字段:/
我没有问题得到所有类字段我使用Spring ReflectionUtils.doWithfield.我存储了所有字段名称List<String> classField,所以我知道所有clazz字段也都继承了.但我的问题是如何将值设置为所有clazz字段.
如果我不得不猜测,我假设您在A类上调用此方法,并期望能够查看在B类中声明的基础字段,如下所示:
A.class.getDeclaredField("superName");
Run Code Online (Sandbox Code Playgroud)
情况并非如此,并将抛出异常(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;
}
Run Code Online (Sandbox Code Playgroud)
这是一个示例电话:findUnderlying(A.class, "superName"); 它首先会检查A类的字段.由于A没有它,因此dowhile会移动到它的超类,即B(不为null,因此继续).B确实拥有它,因此它返回该字段.如果B没有它,它将检查Object,然后返回null,因为Object没有超类.
您可以使用:
clazz.getSuperclass().getDeclaredField(s);
Run Code Online (Sandbox Code Playgroud)
而不是(或另外加上一些try-catch):
clazz.getDeclaredField(s);
Run Code Online (Sandbox Code Playgroud)
编辑:
要设置超类的值,请使用以下命令:
Field f = clazz.getSuperclass().getDeclaredField(s);
f.setAccessible(true); // Especially necessary if the field is not public
f.set(yourObject, theValue);
Run Code Online (Sandbox Code Playgroud)