Java对象图访问者库
您知道一个好的java对象图访问者库吗 我想访问对象及其子组件,并在某些条件匹配时执行一些操作 用法示例:Java对象图访问者库,java,introspection,visitor,object-graph,Java,Introspection,Visitor,Object Graph,您知道一个好的java对象图访问者库吗 我想访问对象及其子组件,并在某些条件匹配时执行一些操作 用法示例: 在大型域对象图上,重置 每个id到null 在大型域对象图上,将每个集合替换为树集 实例包含相同的 元素 我想要一个库,而不是自定义代码,因为遍历对象图可能很棘手。您必须处理集合、数组、代理等。。。 我曾考虑过重用XStream的一部分来实现这一点,但看起来并不容易:XStream访问者更倾向于对象转换而不是对象自修改。为什么需要一个库来实现这一点 既然您指定这是一个域对象图,那么为什
- 在大型域对象图上,重置
每个id到
null
- 在大型域对象图上,将每个
替换为集合
实例包含相同的 元素树集
我曾考虑过重用XStream的一部分来实现这一点,但看起来并不容易:XStream访问者更倾向于对象转换而不是对象自修改。为什么需要一个库来实现这一点 既然您指定这是一个域对象图,那么为什么不定义和实现相关的接口以允许不同的访问者实现访问您的域对象呢?其中一个实现可以(如您所指定)将每个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);
}
}
现在定义一个具体的访问者实现,它可以做一些有用的事情:
public class MyVisitor implements Visitor {
public void visitDomainObjectA(DomainObjectA doa) {
doa.setId(null);
}
public void visitDomainObjectB(DomainObjectB dob) {
doa.setId(UUID.randomUUID());
}
}
将对象图编组为XML并使用一些标准的XML处理/操作库如何?可能值得尝试像或这样的图形数据库。通过使用查询横切数据集并探索关系,您可以影响访问
它们都有丰富的Java API,以方便数据加载和查询。碰巧,我做了这样的事情。不是真正的图书馆,但它可以很容易地发展成为一个图书馆 但我偶然发现了这一点,因为我在寻找更好的东西。我不能给出它,而且它肯定还没有处于我会这样做的状态,但也许这样的东西应该作为操作系统来使用 我所拥有的可以让我逐个实例遍历和修改对象图类型安全的对象图,可以选择复制它,使原始对象图保持不变。顺便说一句,抓取图形中的关系(如果需要,可以抓取边)也有一定的作用 我所能想象的是对操作(如修改、扩展、复制、折叠、遍历)和相应的实现的明确定义。正交方面,例如识别子图,将被适当地分解
任何对这样一个项目感兴趣的人请回复,也许我们可以开始做一些事情。我一直在寻找同样的东西,发现了这个
我已经对你的相关答案提出了更精确的问题。我的领域是巨大的,我的图形是复杂的。所以我需要一些健壮的、已经调试过的、可以随时使用的东西。在我看来,你试图成为优步的泛型,这让问题变得棘手。库中可以遍历任何对象图(可能是通过反射)然后对给定对象调用任何方法的点是什么?您实际上抛弃了任何编译时类型安全性。毕竟,任何OO应用程序都只是在遍历对象图并调用对象子集上的方法。我的域名非常复杂;)顺便说一句,这就是像XStream这样的序列化工具是如何工作的。这是一个很好的建议,但如果可能的话,我想避免。它增加了一些我希望可以避免的步骤