如果对象1被对象2(根)通过任意级别的其他对象引用引用,则可以确定?

时间:2013-10-14 15:52:13

标签: java reflection reference

是否可以通过任意级别的其他对象引用来确定对象'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对象实例,我必须确定,该对象实例是由我的根对象(域模型的根对象)引用的。

非常感谢你的帮助!

0 个答案:

没有答案