Andres Almiray ( Canoo )在Groovy AST Transformations上介绍了此演示文稿。 鉴于使用Groovy AST对那些已经对Groovy有所了解的人可能更有吸引力,因此大多数观众都具有Groovy的经验并不令我感到惊讶。
Almiray将AST Transformations定义为“使能编译时元编程”的“基本字节代码生成”。 他表明Groovy具有AST转换的两种类型:全局和局部。 今天的演讲重点是全球AST转型。
AST Transformations框架是几年前添加到Groovy的,但是在Groovy 1.7中使事情变得更加容易。 Almiray在Groovy中介绍了Delegate Transformation ( @Delegate
批注),它允许已编译的代码具有显式委派给该字段的所有公共方法。 Almiray解释说@Delegate
可以与接口以及类一起使用。 Almiray还解释说,定义的任何新方法都将优先于具有相同签名的任何delgate方法。 同样,遇到的第一个委托优先于其他委托的相同方法签名。
Almiray然后盖上@Singleton
和辛格尔顿转型 。 Almiray表示,通过此转换实现的单例符合Josh Bloch的Effective Java中描述的安全单例的定义。
@Immutable
( 不可变转换 )。 就像@Singleton
转换自动为单例实现所有必要规则一样, @Immutable
转换也为不可变实现规则。 Almiray指出,尝试通过属性集与方法集在不可变的Groovy类上设置属性的尝试有不同的例外。
下一个要涉及的Groovy AST转换是@Category
( 类别转换 )。 这是第一个涵盖的转换,需要完全使用Groovy代码(而不是Java代码)中的用法。 还介绍了Mixin转换 ( @Mixin
)。
Almiray进入了@Grab
报道( Grab Transformation ),这是我之前发布的内容 。 @Grab
对于在运行时下载依赖项很有用。 我喜欢Almiray提到的相同理由:“它非常适合独立脚本。”
Almiray引入了@Synchronized
( 同步转换 )作为指定同步块的Groovier方法 。 Almiray讨论了@Lazy
( 延迟转换 ),该延迟仅用于在实际需要时(首次使用时)初始化值。 Almiray指出了Groovy访问类的私有字段的能力,并警告说,仅应将其用于单元测试,并且仅在生产中绝对必要时使用。
Almiray在使用@Bindable
( Bindable Transformation )显示代码示例之前,演示了@Newify
( Newify Transformation )的@Bindable
,他说将其添加到Groovy中以使使用Swing更容易。 该转换使一个类可观察,并消除了为显式执行此操作而编写所有代码的需要。 @Vetoable
转换类似地使否决属性更改更容易。
正如我在Easy Groovy Logger注入和日志保护一文中所述 , @Log
Log ( 日志转换 )可能非常有用( @ Commons , @ Log4j和@ Slf4j也是如此 )。
Almiray涵盖了一些我最喜欢且最常用的Groovy转换: @ToString (请参阅我的文章 ), @ EqualsAndHashCode (请参阅我的文章 ), @ TupleConstructor (请参阅我的文章 )或它们的组合( @Canonical –请参阅我的文章)发布 )。
在讨论了@Canonical
及其组成转换之后,Almiray转向了覆盖@IndexedProperty
( 相关文章 )。 然后,他列出了其他一些没有代码示例的示例: @AutoClone
, @AutoExternalize
, @ConditionalInterrupt , @TimedInterrupt
, @ThreadInterrupt
, @PackageScope (“在Groovy中获得包级别的访问特定性”), @WithReadLock
, @WithWriteLock
和@Field ( “主要用于脚本内部”)。
我很高兴看到Almiray提到添加@TypeChecked以支持“静态Groovy!”。 他引用了稍后的Groovy 2.0新功能演示,以获取更多详细信息。
Almiray提到新的转换具体到Grails的 ( @Entity
)和格里芬 ( @EventPublisher
, @PropertyListener
, @Treading
,更多)。 他还引用了@Scalify和@Bytecode 。
尽管我已经熟悉了本演示文稿介绍的大部分Groovy AST转换,但是仍然值得参加并了解或提醒其他可用的有用转换。
别忘了分享!
参考: JavaOne 2012:来自JCG合作伙伴 Dustin Marx 的Groovy AST转换的实作,内容来自Inspired by Actual Events博客。
翻译自: https://www.javacodegeeks.com/2012/10/javaone-2012-walk-through-of-groovys.html