当前位置: 首页 > 面试题库 >

像@Override这样的注释在Java内部如何工作?

韩阳云
2023-03-14
问题内容

有人可以向我解释注释在Java内部如何工作吗?

我知道如何通过使用Java中的java.lang.annotation库来创建自定义注释。但是我仍然不知道它在内部如何工作,例如@Override注释。

如果有人可以详细解释,我将非常感谢。


问题答案:

注释类型之间的第一个主要区别是它们是在编译时使用,然后丢弃(如@Override)还是放在已编译的类文件中并在运行时可用(如Spring的@Component)。这由注释的@Retention策略确定。如果要编写自己的注释,则需要确定该注释在运行时(可能是用于自动配置)还是仅在编译时(用于检查或代码生成)有用。

在编译带有注释的代码时,编译器会看到注释,就像在源元素上看到其他修饰符一样,例如访问修饰符(public/
private)或final。当遇到注释时,它将运行一个注释处理器,就像一个插件类,它对特定的注释感兴趣。注释处理器通常使用Reflection
API来检查正在编译的元素,并且可以简单地对它们进行检查,修改它们或生成要编译的新代码。@Override是第一个例子 它使用Reflection
API来确保它可以在其中一个超类中找到方法签名的匹配项,如果不能找到,则使用Messager引起编译错误。


有很多关于编写注释处理器的教程。这是一个有用的。期待通过对这些方法的Processor接口对于编译器是如何调用注释处理器;
主要操作发生在process方法中,每次编译器看到带有匹配注释的元素时,该方法就会被调用。



 类似资料:
  • 问题内容: 是否有一个静态分析工具可以在IDE外部运行一致地强制使用@Override注释?CheckStyle具有MissingOverride检查,但仅适用于使用@inheritDoc Javadoc标记的方法。我正在寻找一种可以在连续集成计算机上的新构建配置中运行的工具。 问题答案: 一种方法是使用TeamCity的“检查”运行器。我不确定它是否真的可以在IDE之外运行,因为它是在Intel

  • 有了这个jdk代码在, java编译器只有注释声明,它足够智能,可以检测错误(编译时): 在下面的问题代码中。 的注释声明刚刚编译为, 它只不过是一个。 所以 语法是否帮助java编译器在编译时检测上述错误?

  • 问题内容: 关闭。 此问题不符合堆栈溢出准则。它当前不接受答案。 想改善这个问题吗? 更新问题,使其成为Stack Overflow 的主题。 2年前关闭。 改善这个问题 是否有一个静态分析工具可以在IDE外部运行一致地强制使用@Override注释?CheckStyle具有MissingOverride检查,但仅适用于使用@inheritDoc Javadoc标记的方法。我正在寻找一种可以在连续

  • Java 中 @Override 注解是用来指定方法重写的,只能修饰方法并且只能用于方法重写,不能修饰其它的元素。它可以强制一个子类必须重写父类方法或者实现接口的方法。 使用 @Override 注解示例代码如下: 上述代码第 6 行是重写 Object 类的 toString() 方法,该方法使用 @Override 注解。如果 toString() 不小心写成了 t0String(),那么程序

  • 问题内容: 我的问题是非常基本的,为什么我们人们使用注释,此注释的重要性是什么? 在旧的JDK中,为什么它不显示为警告,但是在最新的JDK中,则需要“为什么..”? 问题答案: 假设您有: 您 确实 打算覆盖,但是由于签名中的错误,它不是这样做的。如果使用,则可以让编译器检测故障。它 还会 向任何 阅读 代码的人表明这将覆盖现有方法或实现接口-为他们提供有关当前行为以及重命名该方法可能产生的影响的

  • 在我的测试中,我一直使用TestNG注释,如@beforeSuite、@beforeClass等。 但是最近,我一直在阅读有关TestNG侦听器的内容,我不禁感到这些侦听器提供的大多数方法与一些注释的功能完全相同。 例如: @beforeSuite.onstart() @beforeMethod似乎与iInvokedMethodListener.beforeInvocation()相同。