典型的用例是针对简单的事情,比如@Override,但显然你可以用它们做更多的事情。如果你突破它们的极限,就会得到类似Project Lombok的东西,尽管我的理解是这是对注释的大量滥用。你到底能做什么?你可以在编译时和注释运行时做什么?你能做什么?
答案 0 :(得分:6)
我们将运行时注释与反射结合使用,以自定义我们的域模型映射到数据库。我们的表单验证也基于运行时使用的代码中的Annotations。
此外,您可以使用Java附带的注释处理器来预处理源文件
编辑:对于lombok,正如问题中所要求的,添加了一种新的更强大的方式来使用此注释处理,而不是大多数人认为这是可能的。让我用几句话为您描述一下:它们挂钩了
中的Java Annotation Processing步骤这样eclipse会向你展示你真正编写的更多代码,javac也相信这一点。生成器技术使用旧式Java Annoation Processing,但您可以将Lombok视为每个人都需要的缺失胶水,以使其真正有用。
答案 1 :(得分:4)
注释属于反射。注释本身并不提供任何内容,您需要在代码中使用它们,或者将它们与动态代理或字节码重写等联合使用,这些内容也属于反射领域。
反射被称为非常强大的东西,但同时可能危险。
我认为基本问题是:“注释的合法用途是什么,或者更普遍的反思?”。
因为反思和安全之间存在紧张关系(打破类型系统,进入最终领域等),所以有两个阵营:那些拥抱元编程的人和那些拥抱安全即可。什么是合法的最终是品味和意见的问题。
相关问题:
根据您的评论,您似乎最感兴趣的是JSR-269并在编译过程中挂钩。我看到了JSR-269的两个用例:用于DSL /语言工程的自定义错误/语义检查(例如Override)。它是否被广泛用于黑客和实验,我不知道。以下是来自同事的很酷的链接:
那就是说,我会说字节码转换/编译钩子仍然属于元编程。例如,您可以在编译时生成类似于Lombok的getter / setter,或使用在运行时执行此操作的动态代理。所以对我而言,这种二元性意味着我们仍然处于反思领域。
答案 2 :(得分:3)
我很确定你不能用注释来洗衣服。
但除此之外,以下是我体验中注释的一些真正限制:
答案 3 :(得分:1)
注释是元数据,有关信息的信息 - 在这种情况下是您的代码。
使用注释,您可以向注释的使用者提供提示和线索,例如编译器或运行时的代码本身。我曾经在一些场合小心地使用过它们,它们的存在取代了对其他布尔比较评估为true的需要,并且属性提供了关于实际需要做什么的更多信息,因为注释存在。
关于你不能做注释的内容..我不知道如何回答这个问题。如果他们解决了一个真正的问题或使你的代码更优雅,请使用它们,但不要强迫它。
原谅我可能过度简化了事情。
答案 4 :(得分:0)
这个问题非常(太?)广泛,所以我只举一个我感兴趣的例子。 JPA 2.0依靠annotation processing为实体生成静态元模型类(用于使用Criteria API进行类型安全查询)。