如何在Java/Scala中观察/跟踪类成员访问?
我正在开发对现有JavaORM(Ebean)的Scala扩展。本项目的目标是向ORM添加尽可能多的类型安全性。 而不是如何在Java/Scala中观察/跟踪类成员访问?,java,scala,attributes,listener,trace,Java,Scala,Attributes,Listener,Trace,我正在开发对现有JavaORM(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
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
我认为这是确保仅使用该类上存在的此类模型成员的最佳方法,但是,在运行时,我需要一种方法来识别该变量已被访问。否则我只会叫那个成员名字
,在我的查询中不知道这一点
有人知道如何做到这一点吗是否有可能在访问变量时进行跟踪,并在运行时将该信息提供给任何其他对象?
我已经考虑过使用getter和setter,而不是在模型类中使用公共成员,但这会使查询或模型非常难看。另一个问题是,必须为每个模型手动添加任何其他特定方法
如果有人能提出可能的解决办法,我会很高兴。谢谢 你可以看看电梯人员是如何实施和记录的。它允许使用伴随对象(以及使用原始sql)进行类型安全查询。它确实需要将特征继承到模型中,并且字段被指定为对象,而不是常规VAL。也许会有帮助。您可以找到持久性内容的源代码。如果您愿意将模型对象的字段定义为类似于记录字段的内容,Emil的建议可能会起作用,但如果您使用自定义类型在Java ORM之上构建解决方案,则可能会有问题。如果您需要跟踪字段访问,我认为您的最佳选择将是运行时字节码插装,使用类似or的库。您可以将插入指令的“虚拟”对象传递到函数体中,然后跟踪在本地线程中访问的字段。这就是它在中的实现方式。事实上,我非常喜欢在LINQ2SQL或其他模板DAL中找到的“自动类型构建”方法……感谢您给出的鼓舞人心的答案!我决定可能通过Javassist使用字节码操作。因为我想在现有Java ORM的基础上构建,所以我不能在模型中使用自定义类型。一些原型设计表明,将属性访问更改为共存包装器的调用可能是一个非常适合的解决方案。当然,这种操作的范围必须是有限的,但我认为这是一个合适的解决方案,例如注释类型安全选择查询的用法。