【发布时间】: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。
我为什么要这样做?
我面临着复制和粘贴equals和hashCode方法测试,所以我决定编写POJO方法测试框架pojo-tester
它测试对象的相等性、哈希码、getter、setter、toString 和构造函数,因此您不必手动编写测试。
问题是,这个库通过newInstance() 方法创建对象(类的新实例)。之后我想让它们相等 - 基础对象的所有字段值都应该在新创建的对象中设置。
您可以猜到,当equals 方法实现依赖于super.equals(...) 并且超类中的字段具有随机值(如 UUID)或不公开时,就会出现问题。
有什么方法可以实现吗?也许其他一些图书馆?
顺便说一句
如果有人知道如何做到这一点并想做出贡献,只需发送 PR! :)
https://github.com/sta-szek/pojo-tester
谢谢
【问题讨论】:
-
哦……太简单了!非常感谢@Rob!我在这上面花了几个小时,我不知道为什么我没有使用
Field对象的优点 :)
标签: java reflection