当前位置: 首页 > 知识库问答 >
问题:

如何在Java11中生成代码,但以Java8或更高版本为目标?

龙华翰
2023-03-14

我正在开发一个小型库,出于明显的原因,我希望使用Java11的所有特性生成代码(我想现在除了模块),但我希望库与Java8和更高版本兼容。

当我尝试这个:

javac -source 11 -target 1.8 App.java
warning: source release 11 requires target release 11
$ xxd App.class
00000000: cafe babe 0000 0037 ...

而Java8无法加载它:

Exception in thread "main" java.lang.UnsupportedClassVersionError: App has been
    compiled by a more recent version of the Java Runtime (class file version 55.0),
    this version of the Java Runtime only recognizes class file versions up to 52.0
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:468)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:74)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:369)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:363)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:495)

人们是如何提供这样的兼容性的?我对所有构建工具都持开放态度。

对我来说,将高级语言(Java)转换为低级语言(字节码)似乎很容易。在我看来,当高级语言发生变化时,低级语言应该保持不变。这就是为什么我认为这是可能的。

共有1个答案

谭坚诚
2023-03-14

虽然使用复杂的工具从理论上可以将为JDK ;11编译的类转换为JDK ;8,但这并不简单。在二进制级别上有显著的变化。

首先,JDK 11引入了嵌套类型,这消除了在访问内部/外部类的private成员时生成合成访问器方法的需要。当然,这种访问在旧版本中会失败。

它还引入了动态常量,尽管我不知道Java语言是否在任何地方利用了该特性。这主要是为了将来的版本。

Java ;8也不能处理模块定义,但我想,它们会被忽略。

 类似资料:
  • 我在JRE版本中遇到了一些问题,所以我尝试使用插件Choose Runtime来更改它。我将其更改为Java 1.8.0_112-release-287-B2。现在,当尝试启动IntelliJ时,我得到一个不受支持的Java版本错误:不能在Java 1.8.0_112-release-287-B2下启动:需要Java 11或更高版本。我已经尝试修改ide64.exe.jdk文件中的运行时路径,但似

  • 我在androidstudio中导入一个cordova项目,并得到一个错误:找不到已安装的构建工具。请安装Android构建工具版本19.1.0或更高版本。 我已经安装了所有的构建工具。甚至我已经通过了这篇文章,但不能解决错误。 链接1链接2 我在操作系统上看到了很多问题,但没有得到任何解决方案。 我们将不胜感激。谢谢

  • 我在android项目中使用RX库,由于某些原因,我需要进行构建。格拉德尔: 我也访问过这个和这个,但无法修复它。我的项目代码是RegisterActivity。JAVA 提前谢谢

  • 因为classbe依赖于cupergino_icons>=1.0.1需要SDK版本>=2.12.0-0<3.0.0,所以版本解决失败。在Classbe中运行“Flutter pub Get”...pub get失败(1;因为classbe依赖于cuperistino_icons>=1.0.1需要SDK版本>

  • 这些是我的设置: > < li> 用户设定 工作区设置 tasks.json 我该如何解决这个问题?

  • 从7月开始,VisualStudio代码需要Java 11。所以我安装了Java11。但是Azure函数需要Java8。我试图将VS配置为同时使用这两个SDK。 示例:VSCode需要显示"Java11或更高的最新版本才能运行。请下载并安装最新的JDK" VS代码仍在尝试使用Java11。有没有可能改成JDK 8???[警告]Azure功能仅支持JDK 8,低于本地JDK 11.0.8版。 爪哇岛