• 2007-08-07

    与Annotation打交道

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://www.blogbus.com/dreamhead-logs/7502504.html

    因为给XRuby做代码标记的原因,最近一直在Annotation和打交道。在我看来,Annotation是Java 5所有新语言特性中,唯一很难一下子看清楚的特性。其它的特性只要用JAD反编译一下生成的字节码,就一目了然了。我手头的JAD只能处理1.4的字节码,所以,Annotation的某些特性并不能直接反编译出来,比如缺省值。从现实的情况来看,Annotation已经开始有一些不错的应用,比如EJB 3.0,比如JUnit 4。

    从为XRuby写代码的经验来看,Annotation真的是一个不错的东西,应用了Annotation之后,代码变得更加干净,XRuby的代码因此就变得清爽了不少。XRuby通过Annotation做了许多代码生成的工作,如果采用手工编码的方式,这些代码没有难度,只有复杂度。重复的代码写起来,只会让人感到繁琐。

    XRuby中运用Annotation的方式本质上相当于在做编译器的工作。对Annotation的解析,相当于parser解析源代码,当然,相对于parser来说,解析Annotation要简单得多。之后的过程就是类似的过程,根据前面解析的结果对应着进行代码生成。

    在实现XRuby Annotation的过程中,还有一些有趣的工作。比如如何设计Annotation。最初的设计中,RubyLevelMethod有一个type属性,用以标识方法的类型,主要是为了满足XRuby一些优化手段,比如对于无参数和一个参数的方法调用,会做一些特殊处理提高性能。不过,这样的方法通常会有一些特别的签名,这样的签名完全是可以检测出的,所以,实际上这个type属性并不需要,而且,偶尔的误操作(比如无参数方法的type写成了一个参数),还会抛出异常。所以,最终type这个属性被去掉了,当然,这么做需要额外付出一些努力,不过,相对而言,这种努力是值得的。这个问题实际上类似于语言设计一样,哪些东西设计到语言里,哪些部分是隐含可以得到的。

    Annotation可以给我们一些提示,通过诸如代码生成等工作,从而把一些操作从原来的硬编码的方式中转移出去,比如事务,AOP等等。我相信,这样会带来一些设计思路的转变,从而更好的进行设计上的划分。更进一步,设计中完全可以加入更多的业务特性,也就会让代码更有DSL的味道。

    对比于Java中常见的XML方式,我更喜欢Annotation。首先,它和代码结合的更紧密,这样,在阅读的时候,可以更直观的去理解一些东西,而XML的方式中,秘密都在另外的地方。其次,IDE工具可以很好的联系源码,做一些查找引用某些类的情况就会简单得多。当然,有个问题,每次修改可能都需要重新编译代码,这个问题在开发XRuby Annotation的过程中经常遇到。

    InfoQ的Floyd前不久在BEA User Group的活动中谈及企业级Java前景时,提到了他认为几个重要的趋势,包括POJO、IoC(DI),再有就是Annotation。在对Annotation有了更多的了解之后,我认为Annotation是个好东西,只是不知道它的出现是不是有些晚。
    分享到:

    历史上的今天:

    秒杀十分钟 2008-08-07
    引用地址: