当前位置:  开发笔记 > 编程语言 > 正文

Java中注释处理的缺点?

如何解决《Java中注释处理的缺点?》经验,为你挑选了2个好方法。

我正在考虑启动一个项目,用于使用注释在Java中生成代码(我不会详细说明,因为它不是真正相关).我想知道该项目的有效性和实用性,令我印象深刻的是对Annontation Processor Tool(apt)的依赖.

我想知道的是,我不能从经验中说出,在Java中使用注释处理的缺点是什么?

这些可能是任何东西,包括:

在编写处理器时很难做TDD

很难在构建系统中包含处理

处理需要很长时间,而且很难让它快速运行

在IDE中使用注释需要为每个注释添加一个插件,以便在报告错误时使其行为相同

这些只是例子,不是我的意见.我正在研究是否有任何这些是真的(包括问这个问题;-))

我确信一定有缺点(例如,Qi4J特别列出不使用预处理器作为优势)但我没有经验用它来告诉它们是什么.

使用注释处理的合理替代方法可能是为相关IDE创建插件以生成代码(它将类似于覆盖/实现方法功能,可生成没有方法体的所有签名).但是,每次代码的相关部分发生变化时,都必须重复该步骤,据我所知,注释处理不会.

关于注释侵入量给出的示例,我不认为使用需要类似的东西,对于任何给定的类可能是少数.这当然不会阻止它被滥用.



1> Scott Stanch..:

我创建了一组JavaBean注释(http://code.google.com/p/javadude/wiki/Annotations)

[注意:我现在正在开发新版本,因此中继代码与更新站点下载不匹配]

测试

测试它们可能非常有用......

我通常通过在eclipse中使用测试代码创建项目并构建它来进行处理,然后制作副本并关闭注释处理.

然后,我可以使用Eclipse将"活动"测试项目与项目的"预期"副本进行比较.

我还没有太多测试用例(生成如此多的属性组合非常繁琐),但这有帮助.

构建系统

在构建系统中使用注释实际上非常简单.请查看http://code.google.com/p/javadude/wiki/Annotations以获取如何在ant脚本中使用它的示例,并在eclipse中使用它只需要制作一个指定注释处理器的插件扩展并在想要使用它的项目中启用注释处理.

我在连续构建环境中使用了注释处理,构建了注释和处理器,然后在构建的其余部分中使用它.这真的很无痛.

处理时间

我没有发现这是一个问题 - 小心你在处理器中做了什么.我在我的代码中生成了很多代码,运行正常.蚂蚁的速度有点慢.

请注意,Java6处理器可以运行得更快,因为它们是正常编译过程的一部分.但是,我无法让它们在代码生成能力方面正常工作(我认为很多问题是eclipse的支持和运行多阶段编译).现在,我坚持使用Java 5.

错误处理

这是注释API中经过深思熟虑的事情之一.API有一个"messenger"对象,可以处理所有错误.每个IDE都提供一个实现,将其转换为代码中正确位置的相应错误消息.

我做的唯一一个特定于eclipse的事情是强制转换处理环境对象,以便检查它是作为构建运行还是编辑器协调.如果编辑,我退出.最终我会将其更改为仅在编辑时进行错误检查,以便在您键入时报告错误.要小心,虽然-你需要保持它真正快使用过程中和解或编辑变得呆滞.

代码生成陷阱

[每条评论增加一点]

注释处理器规范声明不允许修改包含注释的类.我怀疑这是为了简化处理(进一步的轮次不需要包含带注释的类,也可以防止无限更新循环)

但是,您可以生成其他类,并建议使用该方法.

我为所有get/set方法和我需要生成的任何其他方法生成一个超类.我还让处理器验证带注释的类是否扩展了生成的类.例如:

@Bean(...)
public class Foo extends FooGen

我在同一个包中生成一个类,其中带有带注释的类的名称加上"Gen",并验证是否已声明带注释的类以扩展它.

我见过有人使用编译器树api来修改带注释的类 - 这是违反规范的,我怀疑它们会在某个时刻堵塞那个洞,所以它不会起作用.

我建议生成一个超类.

总体

真的使用注解处理器高兴.设计得非常好,特别是在IDE /命令行构建独立性方面.

现在,如果您正在进行代码生成,我建议您坚持使用Java5注释处理器 - 您需要运行一个名为apt的单独工具来处理它们,然后进行编译.

请注意,Java 5和Java 6注释处理器的API是不同的!Java 6处理API是更好的恕我直言,但我只是没有运气与我需要的Java 6处理器.

当Java 7问世时,我将再次尝试新的处理方法.

如果您有任何疑问,请随时给我发电子邮件.(scott@javadude.com)

希望这可以帮助!



2> Hardy..:

我认为如果注释处理器肯定使用API​​的Java 6版本.这是将来支持的那个.Java 5 API仍然位于非官方com.sun.xyz命名空间中.

我想我们会在不久的将来看到更多的注释处理器API用途.例如,Hibernate正在为新的JPA 2查询相关的静态元模型功能开发处理器.他们还在开发用于验证Bean Validation注释的处理器.所以注释处理就在这里.

工具集成是可以的.最新版本的主流IDE包含配置注释处理器并将其集成到构建过程中的选项.主流构建工具还支持注释处理,其中maven仍然可能引起一些悲伤.

测试我发现了一个很大的问题.所有测试都是间接的,并以某种方式验证注释处理的最终结果.我不能编写任何简单的单元测试,只是断言处理TypeMirrors或其他基于反射的类的简单方法.问题是无法在处理器编译周期之外实例化这些类型的类.在设计API时,我不认为Sun有可靠的可测试性.

推荐阅读
mobiledu2402851373
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有