如何在Java / Scala中观察/跟踪类成员访问?

时间:2012-06-06 18:29:10

标签: java scala attributes listener trace

我正在为现有的Java ORM(Ebean)开发Scala扩展。该项目的目标是为ORM添加尽可能多的类型安全性。 而不是

Ebean.find(Product.class).fetch("name", "unit").findList()

我最终希望能够写出类似

的内容
(objects of entity[Product] with attributes name and unit) getIt

(请注意,这只是第一种DSL方法)。

ORM模型已定义为

@Entity
public class {
    public String name;
    public String unit;
}

为了在编译时为查询中的属性实现类型安全,我需要访问它们,例如像(new Product()).name这样的虚拟对象。

我认为这是确保只使用该类上存在的模型成员的最佳方法,但是,在运行时,我需要一种方法来识别访问此变量。否则我只会调用该成员name,并且在我的查询中不会知道这一点。

有人知道如何实现这一目标吗? 是否有可能跟踪访问变量的时间并在运行时将该信息提供给任何其他对象?

我已经考虑过连接到getter和setter而不是在模型类中使用公共成员,但这会使查询或模型非常难看。另一个问题是,必须为每个模型手动添加任何其他特定方法。

如果有人能提出可能的解决方案,我会很高兴。谢谢!

2 个答案:

答案 0 :(得分:1)

如果您愿意将模型对象的字段定义为记录字段,Emil建议可以使用,但如果您使用自定义类型在Java ORM之上构建解决方案可能是个问题。如果您需要跟踪字段访问,我认为您最好的选择是使用CGLibJavassist等库的运行时字节码检测。您可以将已检测的“虚拟”对象传递到函数体中,然后跟踪在本地线程中访问的字段。这就是Squeryl中的完成方式。

答案 1 :(得分:0)

你可以看看Lift人员如何实施Mapper和记录。它允许使用伴随对象(以及使用原始sql)进行类型安全查询。它确实需要将特征继承到模型中,并且字段被指定为对象而不是常规的val。可能会有所帮助。您可以找到持久性内容here的来源。