扩展类中的Java反射字段值

Łuk*_*zka 1 java reflection

可能重复:
通过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字段.

Ale*_*man 7

如果我不得不猜测,我假设您在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没有超类.


aym*_*ric 5

您可以使用:

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)