您可以做什么而不用Java注释?

时间:2010-06-06 18:26:56

标签: java annotations

典型的用例是针对简单的事情,比如@Override,但显然你可以用它们做更多的事情。如果你突破它们的极限,就会得到类似Project Lombok的东西,尽管我的理解是这是对注释的大量滥用。你到底能做什么?你可以在编译时和注释运行时做什么?你能做什么?

5 个答案:

答案 0 :(得分:6)

我们将运行时注释与反射结合使用,以自定义我们的域模型映射到数据库。我们的表单验证也基于运行时使用的代码中的Annotations。

此外,您可以使用Java附带的注释处理器来预处理源文件

编辑:对于lombok,正如问题中所要求的,添加了一种新的更强大的方式来使用此注释处理,而不是大多数人认为这是可能的。让我用几句话为您描述一下:它们挂钩了

中的Java Annotation Processing步骤
  1. Java-Compiler和
  2. Eclipse IDE,其中生成代码的解析树。
  3. 这样eclipse会向你展示你真正编写的更多代码,javac也相信这一点。生成器技术使用旧式Java Annoation Processing,但您可以将Lombok视为每个人都需要的缺失胶水,以使其真正有用。

答案 1 :(得分:4)

注释属于反射。注释本身并不提供任何内容,您需要在代码中使用它们,或者将它们与动态代理或字节码重写等联合使用,这些内容也属于反射领域。

反射被称为非常强大的东西,但同时可能危险

我认为基本问题是:“注释的合法用途是什么,或者更普遍的反思?”。

因为反思和安全之间存在紧张关系(打破类型系统,进入最终领域等),所以有两个阵营:那些拥抱元编程的人和那些拥抱安全即可。什么是合法的最终是品味和意见的问题。

相关问题:


根据您的评论,您似乎最感兴趣的是JSR-269并在编译过程中挂钩。我看到了JSR-269的两个用例:用于DSL /语言工程的自定义错误/语义检查(例如Override)。它是否被广泛用于黑客和实验,我不知道。以下是来自同事的很酷的链接:

那就是说,我会说字节码转换/编译钩子仍然属于元编程。例如,您可以在编译时生成类似于Lombok的getter / setter,使用在运行时执行此操作的动态代理。所以对我而言,这种二元性意味着我们仍然处于反思领域。

答案 2 :(得分:3)

我很确定你不能用注释来洗衣服。

但除此之外,以下是我体验中注释的一些真正限制:

  1. 他们是静态的。这意味着您无法使用某些动态运行时配置替换它们。因此,如果您从注释中检索到数据库信息,那么这可能非常有限。这样做的框架往往最终需要配置机制,注释和一些XML或其他动态机制。不太好。
  2. 与数字1相关,很难测试。想象一个必须处理一些注释的框架。创建所有要测试的变体是很多锅炉板。
  3. 他们很难消费。反射问题和一般困难使得它们适合于框架要求其用户编写注释,但您永远不希望框架的用户必须分析参数上的注释以确定任何内容

答案 3 :(得分:1)

注释是元数据,有关信息的信息 - 在这种情况下是您的代码。

使用注释,您可以向注释的使用者提供提示和线索,例如编译器或运行时的代码本身。我曾经在一些场合小心地使用过它们,它们的存在取代了对其他布尔比较评估为true的需要,并且属性提供了关于实际需要做什么的更多信息,因为注释存在。

关于你不能做注释的内容..我不知道如何回答这个问题。如果他们解决了一个真正的问题或使你的代码更优雅,请使用它们,但不要强迫它。

原谅我可能过度简化了事情。

答案 4 :(得分:0)

这个问题非常(太?)广泛,所以我只举一个我感兴趣的例子。 JPA 2.0依靠annotation processing为实体生成静态元模型类(用于使用Criteria API进行类型安全查询)。

另见