扩展类中的Java反射字段值

时间:2012-09-18 21:29:45

标签: java reflection

  

可能重复:
  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字段。

3 个答案:

答案 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的访问权限更改为受保护,如果有效...