据我所知,@Documented注释仅由javadoc生成器用于从源生成javadoc.所以保留类型应该是SOURCE,但它是RUNTIME.为什么?
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Documented {
}
Run Code Online (Sandbox Code Playgroud) 我最初的问题是这个问题的完全重复; 也就是说,为什么这个接口有一个运行时保留策略.
但是接受的答案根本不能满足我,原因有两个:
@Documented(我相信)与它无关(虽然为什么@Documented运行时保留策略对我来说也是一个谜);Comparable正如答案所提到的那样,但也Runnable等),这并不妨碍它们被用作"替代品"(例如,你可以完美地使用DirectoryStream.Filteras作为例如,Predicate如果您所做的只是过滤Path,则替换为a .但是,它仍有这种保留.这意味着它必须以某种方式影响JVM行为.怎么样?
我想@FunctionalInterface在我的代码中使用Java 8,但我希望能够使用Java 6生成的类文件.我认为我应该将源代码版本1.8和目标版本改为1.6.
我将@FunctionalInterface仅用于文档,但我注意到它有@Retention(RetentionPolicy.RUNTIME).如果没有人使用该注释,它会导致问题吗?
如果有人在运行时迭代我的对象的注释,它是否会导致缺少类异常?但是,如果这是真的,那么Google Guava如何声明JSR 305注释依赖关系以提供Maven <scope>,这意味着注释如javax.annotation.Nonnull在运行时也会在Guava中丢失,而不会导致问题?
让我用另一种方式问:如果我在项目中使用Google Guava但不包含JSR 305依赖项,那么如果我对代码使用反射,我是否真的会冒一些错误?如果是这样,会发生什么错误?如果不会发生错误,那么类似地,我可以使用@FunctionalInterfaceJava版本编译的源代码中的注释,1.8但是1.6没有任何运行时错误的风险,甚至使用反射?