gpt4 book ai didi

java - @Retention 注解的递归使用,怎么可能?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:29:29 30 4
gpt4 key购买 nike

在java中的@Retention注解的源代码中,@Retention是在其定义本身中使用的,这怎么可能。

RetentionPolicy 都设置在RUNTIME,那么它怎么可能在它还没有准备好运行之前就被执行呢。

package java.lang.annotation;

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
/**
* Returns the retention policy.
* @return the retention policy
*/
RetentionPolicy value();
}

最佳答案

这不是真正的递归。它不过是一个前向引用,分别指向“稍后”之后的类接口(interface)。并且 Java 通常允许使用前向引用。对此有各种限制(请参阅 Java 语言规范,例如 8.3.2.2 部分)- 但这些限制均不适用于此处。

除此之外:请记住这里没有特殊的编译步骤。编译器只是为 Retention 接口(interface)创建一个普通的类文件。但是然后:编译器很可能硬编码了解此接口(interface)。如果使用 RetentionPolicy.SOURCE,编译器甚至会从已编译的类文件中排除注释。这意味着编译器必须进行某种检查(以确定是否注释了某些内容并且启用了 SOURCE 策略)。

换句话说:编译器可能包含类似的东西

if (x instaceof Retention) ...

并且此代码存在于编译器中。以上在编译一些其他注解时工作正常,但在编译 Retention 接口(interface)本身时它也工作。

但关键信息是:没有递归,只有前向引用。使用稍后定义的内容。

关于java - @Retention 注解的递归使用,怎么可能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47456209/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com