繁体   English   中英

如何从jdk 15中提取java预览class文件?

[英]How to extract java preview class files from jdk 15?

我目前正在尝试从 jdk 中提取预览 class 文件,例如 java.lang.Record 从 jrt-fs.jar 中提取文件,但在迭代它时不会在预览类中找到诸如 Record 之类的文件夹。 这是我正在使用的代码:

Path jrtFsJar = jdk15Home.resolve("lib").resolve("jrt-fs.jar");
jrtFsJarLoader = new URLClassLoader(new URL[] {jrtFsJar.toUri().toURL()});
FileSystem jrtFs = FileSystems.newFileSystem(
    URI.create("jrt:/"), 
    Collections.emptyMap(), 
    jrtFsJarLoader);
Files.walk(jrtFs.getPath("/modules")).forEach(path -> 
   // Here is walks over classes such as "modules/java.base/java/lang/Object.class"
   // but not over "modules/java.base/java/lang/Record.class"
)

我也尝试过更直接的方法:

FileSystem fs = FileSystems.getFileSystem(URI.create("jrt:/"));
// Object works, I get the bytes.
byte[] object = Files.readAllBytes(jrtFs.getPath("modules", "java.base",
                                          "java/lang/Object.class"));
// Record fails, NoSuchFile.  
byte[] object = Files.readAllBytes(jrtFs.getPath("modules", "java.base",
                                          "java/lang/Record.class"));

现在,当我使用 --enable-preview 运行完全相同的 jdk 时,我可以使用记录。

如何从 jdk linux/lib 中提取记录 class? 预览 class 在里面还是我应该在其他地方寻找它们? 我需要一个特定的标志来访问它们吗?

任何帮助表示赞赏。

当您在已经有 jrt 文件系统的 JDK 上运行时,您可以更轻松地访问另一个 JDK 的 jrt 文件系统。

FileSystem jrtFs = FileSystems.newFileSystem(
    URI.create("jrt:/"), Map.of("java.home", jdk15Home.toString()));
byte[] object = Files.readAllBytes(
    jrtFs.getPath("modules", "java.base", "java/lang/Record.class"));

内置文件系统将为外部 JDK 的 jrt-fs.jar 创建一个特殊的 class 加载程序,该加载程序不会委托给此 Z68995FCBF432492D45484D04A9D2AC 的类的父加载程序所以它不会再次以自己的方式结束。

由于它使用其他 JDK 提供的实现,因此它将能够使用完全不同的数据格式进行模块存储来处理更新的功能甚至 JDK。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM