Java反射,更改超类中声明的字段值

时间:2016-11-18 18:28:47

标签: java reflection

给定课程:

public class A {
    private UUID uuid;

    public A(){
         uuid = UUID.randomUUID();
    }
    // equals
}

class B extends A {
    private int b;
    // getters, setters, equals (invokes super.equals(...))
}

class Sample {

    public static void main(String[] args){
    B b1 = new B();   // 
    B b2 = B.class.newInstance();

    // now I want to take value of A.uuid from b1 and set it to b2
    }
}

问题

我不知道如何从b1实例获取uuid字段的值并将其设置为b2。 A类中的私有字段是B.class.getDeclaredFields()和类似方法无法访问的... java编译器是否创建了这样的合成访问器或smth?

请注意

A课程中没有公共getter和setter。

我为什么要这样做?

我面临着复制和粘贴equalshashCode方法测试,因此我决定编写POJO方法测试框架pojo-tester 它测试对象相等性,哈希码,getter,setter,toString和构造函数,因此您不必手动编写测试。

问题是,这个库通过newInstance()方法创建对象(类的新实例)。之后我想让它们相等 - 应该在新创建的对象中设置基础对象的所有字段值。

正如您所猜测的,当equals方法实现依赖于super.equals(...)并且超类中的字段具有随机值(如UUID)或不公开时,会出现问题。

有没有办法实现这个目标?也许其他一些图书馆?

BTW

如果有人知道如何做并希望贡献,请发送PR! :)

https://github.com/sta-szek/pojo-tester

由于

1 个答案:

答案 0 :(得分:1)

使用它。

Field[] fs = b.getClass().getSupperClass().getDeclaredFields();
for(Field f: fs)
 {
  if(f.getName().equals("uuid"))
     {
       f.setAccessible(true);
       return f.get( new UUID() );
      }
 }