请考虑以下代码:
A.java:
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
@interface A{}
Run Code Online (Sandbox Code Playgroud)
C.java:
import java.util.*;
@A public class C {
public static void main(String[] args){
System.out.println(Arrays.toString(C.class.getAnnotations()));
}
}
Run Code Online (Sandbox Code Playgroud)
编译和运行按预期工作:
$ javac *.java
$ java -cp . C
[@A()]
Run Code Online (Sandbox Code Playgroud)
但是考虑一下:
$ rm A.class
$ java -cp . C
[]
Run Code Online (Sandbox Code Playgroud)
我会期望它抛出一个ClassNotFoundException,因为@A缺少.但相反,它会默默地删除注释.
这种行为是在JLS的某个地方记录的,还是Sun的JVM的怪癖?它的基本原理是什么?
这样的事情似乎很方便javax.annotation.Nonnull(看起来应该是这样@Retention(CLASS)的)但是对于许多其他注释来说,似乎它可能会导致在运行时发生各种不好的事情.
我试图在GWT项目中使用Guava但没有成功(确切地说是HashMultimap).我得到了一个永不停止的类堆栈跟踪列表:
每个堆栈跟踪沿着以下行:
查看代码,每个抛出错误的文件包括:
import javax.annotation.Nullable;
并且,查看guava-src-r07.jar,每个提到的类都使用@Nullable注释.
我正在使用JDK6并查看JDK6 javadoc并且......好吧,我找不到任何这样的注释.我可以让这些库与GWT项目和JDK6一起使用吗?
PS - 你在那边使用什么版本的Java?
我有以下scala文件:
object SGuavaTryout {
com.google.common.cache.CacheBuilder.newBuilder()
}
Run Code Online (Sandbox Code Playgroud)
我在类路径中使用guava-11.0.2.jar进行编译.我的scala 2.9.1编译器(eclipse插件和普通scalac)抱怨:
error while loading CacheBuilder, Missing dependency
'class javax.annotation.CheckReturnValue', required by
D:\devel\eclipse-workspace\Scala Spielwiese\guava-11.0.2.jar
(com/google/common/cache/CacheBuilder.class)
Run Code Online (Sandbox Code Playgroud)
要编译,我需要将jsr305(jsr305-1.3.9.jar)添加到构建路径.没有jsr305的java等价编译就好了:
public class JGuavaTryout {
public void tryout() {
com.google.common.cache.CacheBuilder.newBuilder();
}
}
Run Code Online (Sandbox Code Playgroud)
scala需要jsr305的任何想法?是否有官方的jsr305实现与番石榴一起使用?
谢谢! - 乔治
我想@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没有任何运行时错误的风险,甚至使用反射?