你可以用java注释做什么和不做什么?[已关闭]

2022-09-02 13:48:40

典型的用例是用于简单的事情,如@Override,但显然你可以用它们做更多的事情。如果你突破它们的极限,你会得到像龙目岛项目这样的东西,尽管我的理解是,这是对注释的巨大滥用。你到底能做些什么?在编译时和运行时,您可以使用注释执行哪些操作?你有什么不能做的?


答案 1

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

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

编辑:对于龙目岛,正如问题中所问的那样,增加了一种新的更强大的方法来使用这种注释处理,比这里的大多数人都认为可能。让我用几句话为您描述这一点:它们将Java注释处理步骤挂钩在

  1. Java编译器和
  2. Eclipse IDE,其中生成代码的解析树。

通过这种方式,eclipse向你展示了更多你真正编写的代码,javac也相信这一点。生成器技术使用旧式Java Annoation Processing,但您可以将龙目岛视为每个人都需要的缺失胶水,以使其真正有用。


答案 2

批注属于反射。注释本身并不能提供任何东西,你需要在代码中使用它们,或者将它们与动态代理或字节码重写之类的东西结合使用,这也属于反射领域。

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

我认为根本的问题是:“注释的合法用途是什么,或者更一般的反思?

因为反射和安全(中断类型系统,访问最终字段等)之间存在紧张关系,因此有两个阵营:那些拥抱元编程的人和那些拥抱安全的人。什么是合法的,归根结底是一个品味和意见的问题。

相关问题:


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

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


推荐