【发布时间】:2017-08-09 17:18:30
【问题描述】:
我想在我的代码中使用来自 Java 8 的 @FunctionalInterface,但我希望能够使用 Java 6 生成的类文件。我认为我应该将源版本设置为 1.8,并且目标版本为1.6。
我将使用@FunctionalInterface 仅用于文档,但我注意到它有@Retention(RetentionPolicy.RUNTIME)。如果没有人使用该注释,会不会引起问题?
如果有人在运行时对我的对象的注解进行迭代,是否会导致缺少类异常?但是,如果这是真的,那么 Google Guava 怎么能declare the JSR 305 annotation dependency 提供一个 Maven <scope>,这意味着在 Guava 中,运行时也缺少诸如 javax.annotation.Nonnull 之类的注释,而不会造成问题?
让我换个方式问:如果我在我的项目中使用 Google Guava 但不包含 JSR 305 依赖项,如果我在代码上使用反射,我真的会冒一些错误的风险吗?如果是这样,会发生什么错误?如果不会发生错误,那么类似地,我是否可以在使用 Java 版本 1.8 编译但针对版本 1.6 的源代码中使用 @FunctionalInterface 注释,而不会有任何运行时错误的风险,即使使用反射也是如此?
【问题讨论】:
-
您阅读了您的链接吗?它明确指出您需要添加 JSR305 实现,因此
javax.annotation.Nonnull不会 在运行时丢失。所以是的,如果在运行时FunctionalInterface丢失并且需要加载,您将获得NoClassDefFoundError。 -
其实我之前确实读过它,但显然我读得不够仔细。似乎是说,如果您实际上不使用 JSR 305 注释,则不会遇到问题,但是如果您在 Guava 上使用反射,如果您没有包含,将会遇到问题您自己项目中的依赖项。 (奇怪的是,我已经在我自己的项目中包含了 JSR 305 注释和
provided的<scope>并且从未遇到问题......但我没有尝试过反思。)也许你可以添加一个单独的答案来澄清我的用例,以便我可以将其标记为已接受。无论如何,谢谢。 -
好的,我再次阅读了原始链接,这绝不是直截了当的。首先,您所说的“[i]t 明确指出您需要添加 JSR305 实现,因此
javax.annotation.Nonnull不在运行时丢失”的链接并不完全正确;问题和答案是关于为什么有人在 compile 时突然不再获得 JSR 305 支持。在阅读 stackoverflow.com/a/3567969/421049 之后,我不清楚如果将它们声明为provided,通过反射迭代 JSR 305 注释是否会导致问题。我很困惑。 -
我想如果你只迭代它们,它们不会引起问题,根据你的链接。但是我想 JSR305 注释通常不只是迭代,你有特定的硬依赖来检查不同的注释是否存在并基于它执行逻辑。
-
@kayaman 在这里你“假设”并且在你的回答中你“猜测”。我不是刻意刻薄,但你的答案似乎不是很确定……我想我问这个问题是为了看看有人知道肯定,而不是假设或猜测。跨度>
标签: java maven annotations runtime