给定课程:
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。
我为什么要这样做?
我面临着复制和粘贴equals
和hashCode
方法测试,因此我决定编写POJO方法测试框架pojo-tester
它测试对象相等性,哈希码,getter,setter,toString和构造函数,因此您不必手动编写测试。
问题是,这个库通过newInstance()
方法创建对象(类的新实例)。之后我想让它们相等 - 应该在新创建的对象中设置基础对象的所有字段值。
正如您所猜测的,当equals
方法实现依赖于super.equals(...)
并且超类中的字段具有随机值(如UUID)或不公开时,会出现问题。
有没有办法实现这个目标?也许其他一些图书馆?
BTW
如果有人知道如何做并希望贡献,请发送PR! :)
https://github.com/sta-szek/pojo-tester
由于
答案 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() );
}
}