【问题标题】:Java reflection, change value of field declared in superclassJava反射,改变超类中声明的字段值
【发布时间】:2016-11-18 18:28:46
【问题描述】:

给定类:

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 编译器是否会创建任何合成访问器或类似的东西?

注意

A 类中没有公共 getter 和 setter。

我为什么要这样做?

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

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

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

有什么方法可以实现吗?也许其他一些图书馆?

顺便说一句

如果有人知道如何做到这一点并想做出贡献,只需发送 PR! :)

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

谢谢

【问题讨论】:

标签: java reflection


【解决方案1】:

使用这个。

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

【讨论】:

  • 不应该f.get( new UUID() );f.get(b);?但是,是的,我认为缺少的链接是setAccessible(true)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-08
  • 1970-01-01
  • 2011-06-27
  • 1970-01-01
  • 2021-09-18
  • 1970-01-01
相关资源
最近更新 更多