Java对象图访问者库

时间:2010-07-29 10:39:08

标签: java introspection visitor object-graph

你知道一个好的java对象图访问者库吗?

我想访问一个对象及其子组件,并在某些条件匹配时执行一些操作。

使用示例:

  • 在巨大的域对象图上,重置 每个ID为null
  • 在一个巨大的域对象图上,用Set替换每个TreeSet 包含相同的实例 元件。

我想要一个库,而不是自定义代码,因为遍历一个Object图可能很棘手。您必须处理集合,数组,代理等... 我已经考虑过重用XStream的一部分来实现这一点,但它看起来并不那么容易:Xstream访问者更倾向于对象转换,而不是对象自我修改。

5 个答案:

答案 0 :(得分:2)

碰巧,我做过这样的事情。不是真正的图书馆,但它可以很容易地成长为一个。

但是因为我正在寻找更好的东西,我偶然发现了这一点。我不能放弃它,而且它还没有处于我会这样做的状态,但也许这样的事情应该像操作系统那样生存?

我拥有的东西让我遍历和修改对象图类型安全,逐个实例,可选地复制它,使原始保持不变。 Java BTW。还有一点工作就是抓住图中的关系(边缘,如果你愿意的话)。

我可以想象的是操作的明确定义(例如修改,扩展,复制,折叠,遍历)和各自的实现。诸如识别子图的正交方面将被适当地考虑在内。

任何对此类项目感兴趣的人都请回复,也许我们可以开始。

答案 1 :(得分:2)

我一直在寻找同样的东西,并找到了这个。

http://code.google.com/p/behaim/

答案 2 :(得分:1)

为什么你需要一个库?

鉴于您指定这是一个域对象图,那么为什么不定义和实现相关接口以允许您的域对象被不同的访问者实现访问?其中一个实现可以(如您指定的那样)将每个ID重置为null

示例

首先定义要由可以访问或充当访问者的对象实现的接口。

public interface Visitable {
  void visit(Visitor visitor);
}

public interface Visitor {
  void visitDomainObjectA(DomainObjectA obj);
  void visitDomainObjectB(DomainObjectB obj);
}

现在定义两个域对象类,这两个类都可以访问。

public abstract class DomainObject implements Visitable {
  private Object id;

  public Object getId() { return this.id; }
  public void setId(Object id) { this.id = id; }
}

public class DomainObjectA extends DomainObject {
  public void visit(Visitor visitor) {
    visitor.visitDomainObjectA(this);
  }
}

public class DomainObjectB extends DomainObject {
  public void visit(Visitor visitor) {
    visitor.visitDomainObjectB(this);
  }
}

现在定义一个具有实用功能的具体的Visitor实现:

public class MyVisitor implements Visitor {
  public void visitDomainObjectA(DomainObjectA doa) {
    doa.setId(null);
  }

  public void visitDomainObjectB(DomainObjectB dob) {
    doa.setId(UUID.randomUUID());
  }
}

答案 3 :(得分:1)

如何将对象图编组为XML并使用一些标准的XML处理/操作库?

答案 4 :(得分:1)

尝试使用Neo4jTitanDB等图表数据库可能值得。它可以让您通过使用查询来交叉剪切数据集并探索关系来影响访问。

这两个都有广泛的Java API来促进数据加载和查询。