对象可以通过注释扩展功能吗? (SugarORM示例)

时间:2016-08-15 22:51:11

标签: java oop inheritance orm annotations

我注意到在SugarORM中,允许对象调用object.save(),即使save()实际上没有直接在对象中实现,并且所有对象都有在顶部声明的注释@Table该课程。

如果一个对象所做的只是使用注释,它如何执行一个函数?

1 个答案:

答案 0 :(得分:2)

在Java中,注释不能直接增强类;它只是其他工具读取的元数据。但是,有一些工具可以处理注释并自动生成其他代码。两个例子:

  • Spring Roo使用注释生成AspectJ类型间声明(基本上是类的外部附加组件),这些声明被编译到最终的类文件中。
  • Lombok使用编译器扩展来支持许多在Java(或Groovy)类上执行转换的特定注释,例如添加样板构造函数和getter / setter。 Lombok使用的方法深入到编译器内部并且非常脆弱。

在Groovy中,注释可以直接增强类,因为它们可以触发在编译时静态应用的转换。常见转换包括@ToString(添加友好的toString()方法)和@EqualsAndHashCode(根据类的属性生成这些方法)。

在Sugar ORM的这种特定情况下,save()上定义了SugarRecord等方法,因此直接扩展SugarRecord的类可以使用它们。或者,the test cases involving annotated classes使用静态导入来解析这些方法。