是否可以通过任意级别的其他对象引用来确定对象'R'(根)是否引用了对象'O'?
示例:
public class Car {
public Driver driver;
}
public class Driver {
public License license;
}
public class License {
public ID id;
}
public class ID {
}
使用此设置,引用为'Car - >司机 - >许可证 - > ID”。
现在,当我遇到'Car'(C)和'ID'(I)的实例时,我想确定,如果我被C引用(不是直接引用,而是通过其他引用的任何级别) )。
一种解决方案是递归地使用反射并使用搜索根“搜索”实例“ID”,并使用“Car”。如果算法从'Car'开始并且“沿着参考树向下”并且它找到'ID'实例,则意味着'ID'被'Car'间接引用。 (只是像XML序列化器一样的递归算法,访问对象层次结构)。
这个解决方案的缺点是,找到答案需要相当长的时间,因为在最坏的情况下,必须访问整个对象层次结构(从“Car”开始访问(当然,对象树可能很复杂) )。
我现在的具体问题是:是否可以反过来做,从'ID'到根'Car',就像使用父类一样,但是具体的对象引用?
伪代码看起来像这样:
parent = ID.getParent()
while ( parent != Car ) {
parent = parent.getParent()
if ( parent == null )
break;
}
(请注意,伪代码适用于对象和引用,而不适用于父类。)
我不确定Java Reflection是否能够执行此操作,或者如果没有这样的child->父引用信息,则不会手动设置类成员引用。
我的目标如下:
A有一个包含大量类的复杂域模型。如果这些类中的任何一个类属性被写入(例如'car.setDriver(...)),我必须序列化整个域模型(“保存文档”)。要检测属性更改(请注意我不能在我的上下文中使用AOP),我在域类的setter-methods中使用自己的PropertyChangeSupport,并将PropertyChangeEvents推送到EventBus。现在我可以检测到更改并相应地保存域模型。
还有一个问题:如果属性更改属于一个cartain对象实例,我必须确定,该对象实例是由我的根对象(域模型的根对象)引用的。
非常感谢你的帮助!