相关疑难解决方法(0)

为什么缺少注释不会在运行时导致ClassNotFoundException?

请考虑以下代码:

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)的)但是对于许多其他注释来说,似乎它可能会导致在运行时发生各种不好的事情.

java annotations

82
推荐指数
3
解决办法
1万
查看次数

番石榴r07,GWT和javax.annotation.Nullable

我试图在GWT项目中使用Guava但没有成功(确切地说是HashMultimap).我得到了一个永不停止的类堆栈跟踪列表:

  • com.google.common.collect.ComparisonChain
  • com.google.common.collect.ForwardingSortedSetMultimap
  • com.google.common.collect.Ordering
  • ...

每个堆栈跟踪沿着以下行:

  • line xx:无法解析导入javax.annotation
  • line xx:Nullable无法解析为某个类型
  • line xx:Nullable无法解析为某个类型
  • line xx:Nullable无法解析为某个类型
  • ...

查看代码,每个抛出错误的文件包括:

import javax.annotation.Nullable;

并且,查看guava-src-r07.jar,每个提到的类都使用@Nullable注释.

我正在使用JDK6并查看JDK6 javadoc并且......好吧,我找不到任何这样的注释.我可以让这些库与GWT项目和JDK6一起使用吗?

PS - 你在那边使用什么版本的Java?

gwt guava

23
推荐指数
3
解决办法
2万
查看次数

为什么我需要jsr305才能在scala中使用guava?

我有以下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实现与番石榴一起使用?

谢谢! - 乔治

scala guava

19
推荐指数
3
解决办法
5877
查看次数

Java运行时保留批注在以前的Java版本中的兼容性

我想@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没有任何运行时错误的风险,甚至使用反射?

java annotations runtime maven

3
推荐指数
1
解决办法
492
查看次数

标签 统计

annotations ×2

guava ×2

java ×2

gwt ×1

maven ×1

runtime ×1

scala ×1