Java中注释处理的缺点?
我正在考虑启动一个项目,该项目用于使用注释在Java中生成代码(我不会深入讨论细节,因为这并不真正相关)。我想知道这个项目的有效性和有用性,让我印象深刻的是对注释处理器工具(apt)的依赖 我想知道的是,根据经验,在Java中使用注释处理有哪些缺点 这些可能是任何东西,包括:Java中注释处理的缺点?,java,Java,我正在考虑启动一个项目,该项目用于使用注释在Java中生成代码(我不会深入讨论细节,因为这并不真正相关)。我想知道这个项目的有效性和有用性,让我印象深刻的是对注释处理器工具(apt)的依赖 我想知道的是,根据经验,在Java中使用注释处理有哪些缺点 这些可能是任何东西,包括: 编写处理器时很难进行TDD 在构建系统中包含处理是很困难的 处理需要很长时间,很难让它快速运行 在IDE中使用注释需要每个都有一个插件,以使其在报告错误时表现相同 这些只是例子,不是我的观点。我正在研究这些是否属实(包
- 编写处理器时很难进行TDD
- 在构建系统中包含处理是很困难的
- 处理需要很长时间,很难让它快速运行
- 在IDE中使用注释需要每个都有一个插件,以使其在报告错误时表现相同
关于给定的大量注释的示例,我不认为需要这样的使用,对于任何给定的类,可能需要少量注释。当然,这并不能阻止它被滥用。一个有助于回答这个问题的具体问题是,与什么相反?不做项目,或者不使用注释?如果不使用注释,还有哪些替代方案 就我个人而言,我发现过多的注释不可读,而且很多时候过于死板。请看一下web服务上实现供应商所需WSDL的一种方法:
@WebMethod(action=QBWSBean.NS+"receiveResponseXML")
@WebResult(name="receiveResponseXML"+result,targetNamespace = QBWSBean.NS)
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public int receiveResponseXML(
@WebParam(name = "ticket",targetNamespace = QBWSBean.NS) String ticket,
@WebParam(name = "response",targetNamespace = QBWSBean.NS) String response,
@WebParam(name = "hresult",targetNamespace = QBWSBean.NS) String hresult,
@WebParam(name = "message",targetNamespace = QBWSBean.NS) String message) {
我觉得那段代码很难读懂。不过,XML配置替代方案并不一定更好。我已经创建了一组JavaBean注释() [注意:我正在开发新版本,因此主干代码与更新站点下载不匹配] 测试 测试它们可能非常困难 我通常通过在eclipse中使用测试代码创建一个项目并构建它来实现它,然后进行复制并关闭注释处理 然后,我可以使用Eclipse将“活动”测试项目与项目的“预期”副本进行比较 我还没有太多的测试用例(生成这么多的属性组合非常繁琐),但这很有帮助 构建系统 在构建系统中使用注释实际上非常容易。看一个在ant脚本中如何使用它的示例,在eclipse中使用它只需制作一个指定注释处理器扩展的插件,并在想要使用它的项目中启用注释处理 我在连续构建环境中使用了注释处理,构建注释和处理器,然后在构建的其余部分使用它。这真的很无痛 处理时间 我还没有发现这是一个问题-小心你在处理器中做什么。我在我的程序中生成了很多代码,运行良好。蚂蚁的速度稍微慢一点 请注意,Java6处理器可以运行得更快一些,因为它们是正常编译过程的一部分。然而,我很难让它们在代码生成能力中正常工作(我认为主要问题在于eclipse的支持和运行多阶段编译)。现在,我坚持使用Java5 错误处理 这是注释API中经过深思熟虑的最好方法之一。API有一个处理所有错误的“messenger”对象。每个IDE都提供了一个实现,可以在代码的正确位置将其转换为适当的错误消息 我所做的唯一一件特定于eclipse的事情是强制转换processing environment对象,以便检查它是作为构建运行还是作为编辑器协调运行。如果编辑,我退出。最后,我会将此更改为在编辑时只进行错误检查,以便它可以在您键入时报告错误。不过,要小心--在对账或编辑过程中,您需要保持非常快的速度以供使用 代码生成问题解决了 [每评论增加一点内容] 批注处理器规范声明不允许修改包含批注的类。我怀疑这是为了简化处理(进一步的循环不需要包括注释类,也可以防止无限的更新循环) 但是,您可以生成其他类,他们推荐这种方法 我为所有get/set方法和需要生成的任何其他方法生成一个超类。我还让处理器验证带注释的类是否扩展了生成的类。例如:
@Bean(...)
public class Foo extends FooGen
我在同一个包中生成一个名为注释类加上“Gen”的类,并验证注释类是否声明为扩展它
我见过有人使用编译器树api修改带注释的类——这是违反规范的,我怀疑他们会在某个时候堵塞这个漏洞,所以它不会工作
我建议生成一个超类
总体
我真的很高兴使用注释处理器。设计非常好,特别是在IDE/命令行构建独立性方面
现在,我建议坚持使用t