【问题标题】:Why can Java 8 load Java 9 class?为什么 Java 8 可以加载 Java 9 类?
【发布时间】:2018-12-21 08:39:35
【问题描述】:

我有以下设置:

A 类 - 使用 java 9 编译(类版本 53)
B 类 - 应使用 java 8(类版本 52)编译

B 类依赖于 A 类。

现在我得到了一个令人惊讶的结果: 我可以使用 Java 8 成功编译 B 类,尽管它依赖于 Java 9 编译的 A 类。

如果我使用 Java 10 或 Java 11 编译 A 类,然后尝试使用 Java 8 编译 B 类,我会收到预期的错误消息:

类文件的版本错误 55.0(或 54.0),应该是 52.0

那么谁能解释一下为什么我没有收到消息

类文件的53.0版本错误,应该是52.0

如果我尝试将 Java 8 与 Java 9 类一起使用?

我使用这个 java 版本:

Java 8:Oracle jdk 1.8.0_144(安装在文件夹 d:\jdk8)
Java 9:Oracle jdk 9.0.1(安装在文件夹 d:\jdk9)
Java 11:Oracle jdk 11.0.1(安装在文件夹 d:\jdk11)

为了演示它,我创建了这两个类文件:

文件 A.java:

public class A {
    public void test() {
        System.out.println("Class A");
    }
}

文件 B.java:

public class B {
    public static void main(String[] args) {
        A classA = new A();
        classA.test();

        System.out.println("Class B");
    }
}

第一个 A.java 是用 Java 9 编译的:
d:\jdk9\bin>javac d:\test\A.java

然后 B.java 使用 Java 8 编译,使用 Java 9 编译的 A 类:
d:\jdk8\bin>javac -cp d:\test d:\test\B.java

警告:d:\test\A.class: 主版本 53 比 52 新,这是此编译器支持的最高主版本。
建议升级编译器。
1 个警告

所以类文件编译成功并出现警告。我刚刚通过手动调用编译器看到了这个警告。如果我使用 Maven 构建项目, 此警告不可见。

现在 A 类是用 Java 11 编译的(与 Java 10 相同):
d:\jdk11\bin>javac d:\test\A.java

如果我尝试编译 B 类,我得到一个错误:

d:\jdk8\bin>javac -cp d:\test d:\test\B.java

d:\test\B.java:3: 错误:无法访问 A
A 类 A = 新 A();
^
错误的类文件:d:\test\A.class
类文件有错误的版本 55.0,应该是 52.0
请删除或确保它出现在类路径的正确子目录中。
1 个错误

所以从技术上讲,Java 8 可以使用 Java 9 编译的类文件。但我认为这是不可能的。

【问题讨论】:

  • 我假设您在谈论某种库?你能给出发生这种情况的具体情况吗?
  • 你的机器上的javacjava版本是什么,你在哪里编译B类?
  • 你如何编译你的类?
  • 我在最初的帖子中添加了带有示例的编译器版本。

标签: java unsupported-class-version


【解决方案1】:

java 9 编译器javac 可能是为 java 8 编译的;可以使用较新的编译器为较旧的 .class 版本进行编译。寻找 -target-source 1.8。

IDE 或 maven/gradle 配置为旧版本。

【讨论】:

  • 我认为这里不是这种情况。我用十六进制编辑器查看了class文件,发现class版本真的是53.0 -> java9。
  • 你提到手动编译出错,maven通过了,所以maven好像有设置,要么在pom里,要么在一些属性里,甚至在settings.xml里。请注意,maven 的 .class 文件可能在另一个位置。
  • 我提到在这两种情况下(手动和 Maven 构建),“Java 8 with Java 9 classes”都通过了。我只在手动案例中看到了警告。在这两种情况下,“Java 8 with java 11 classes”都失败了。
  • 抱歉,我仍然觉得很难相信版本 8 的 java 可以做版本 9 的类。使用新的发布方案可能会出现这种情况,但也许有人否则可能会对这个主题有所了解。在测试项目中尝试一下。
  • 我也不敢相信。这就是我在这里发布的原因;-) 但是警告表明 Java 8 知道它使用更新的类文件(至少是 Java 9 类),但它并没有编译失败。我无法在 Java 文档中获得任何相关信息。
猜你喜欢
  • 1970-01-01
  • 2018-12-24
  • 2014-12-19
  • 1970-01-01
  • 2019-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多