扩展类中的Java反射字段值

标签 java reflection

<分区>

Possible Duplicate:
Access to private inherited fields via reflection in Java

你好,我遇到了 java 反射初始化值的问题。

我有简单的类(class)

 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

我如何使用反射设置所有类字段以及来自父类(super class)的字段??

我有所有类字段(也是继承的)并且我正在使用函数 field.set(Object obj, Object value)但是这样我就不能设置继承的类字段:/

我在使用 Spring ReflectionUtils.doWithfield 获取所有类字段时没有遇到问题。 我将所有字段名称存储在 List<String> classField 中,所以我知道所有的 clazz 领域也继承了。但我的问题是如何为所有 clazz 字段设置值。

最佳答案

如果我不得不猜测,我假设您正在类 A 上调用此方法,并期望能够查看类 B 中声明的基础字段,如下所示:

A.class.getDeclaredField("superName");

如果不是这样,会抛出异常(java.lang.NoSuchFieldException)。反射不检查父类(super class)来查找字段或方法。因此,由于 A 类没有定义 superName,因此不会像那样使用反射找到它。但是,您可以修改代码以使其检查所有父类(super class),直到它作为父类(super class)到达 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 然后移至它的父类(super class),即 B(不为空,所以继续)。 B 确实有它,所以它然后返回该字段。如果 B 没有它,它会检查 Object,然后返回 null,因为 Object 没有父类(super class)。

关于扩展类中的Java反射字段值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12485351/

相关文章:

java - 如何在 Apache Tomcat 服务器中保护我的代码?

java - 一般如何测试非 RxJava 可观察对象或异步代码?

java - 用于测试 Java 类结构的库或框架

java - 在远程计算机上执行 jar 失败

java - 项目在可执行 jar 文件后不显示图标

C++:从类型索引获取父类(super class)类型索引

c# - .NET 程序集 : understanding type visibility

c# - 不区分大小写的 GetMethod?

.net - 使用 .NET 配置数据类型上的反射构建动态生成的配置 UI

java - Android 和 Dropbox 同步库