【发布时间】:2018-03-27 13:19:08
【问题描述】:
我有使用 jdk8 作为 java 1.8 的目标和源编译的代码,并使用 Unsafe。我尝试使用 jdk9 运行该程序,但失败并出现以下异常:
java.lang.NoSuchMethodError: sun.misc.Unsafe.getByte
包 sun.misc.Unsafe 没有从 jdk9 中删除,所以我希望代码能够运行。我不能用jdk9重新编译代码,我希望java应该是向后兼容的。
我创建了一个不适合我的小测试。 测试类:
import java.lang.reflect.Field;
import sun.misc.Unsafe;
public class Test {
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
System.out.println("before");
Field theUnsafeField = Unsafe.class.getDeclaredField("theUnsafe");
theUnsafeField.setAccessible(true);
Unsafe unsafe = (Unsafe) theUnsafeField.get(null);
unsafe.getByte(new Object(), 4);
System.out.println("after");
}
}
然后我用jdk8编译代码。
C:\Java-IDE\jdk1.8.0_121\bin\javac.exe Test.java
如果我用 jdk8 运行它,它可以工作:
C:\Java-IDE\jdk1.8.0_121\bin\java.exe Test
before
after
如果我用 jdk9 运行它会抛出异常:
C:\Java-IDE\jdk-9.0.4_windows-x64_bin\bin\java.exe Test
before
Exception in thread "main" java.lang.NoSuchMethodError: sun.misc.Unsafe.getByte(Ljava/lang/Object;I)B
at Test.main(Test.java:13)
相信在jdk9下也应该可以运行。有可能吗?
【问题讨论】:
-
您可能只需要添加
jdk.unsupported模块 - 在命令行上尝试--add-modules=jdk.unsupported或更新项目的模块信息(如果有的话)。 -
是的,我正在运行 --add-modules=jdk.unsupported 但它仍然抛出异常
-
这里有点可疑。该方法在 JDK 9 和 JDK 10 中仍然存在。请告诉我们更多关于您是如何运行它的?
-
我看到了问题,getByte(Object,int) 已被删除。将 4 转换为 (long)4 以便使用 getByte(Object,long) 方法。
-
对了,你需要重新编译代码(使用JDK 8)才能使用getByte(Object,long)。然后它将在 JDK 8 和 JDK 9 上运行。
标签: java-9 backwards-compatibility unsafe