如何从JDK15中提取java预览类文件?
我目前正试图从jdk中提取预览类文件,如java。来自jrt fs的lang.记录。jar(在libs文件夹中),但在对其进行迭代时,它找不到诸如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中提取记录类?预览类是在它里面,还是我应该在其他地方寻找它们?我需要一个特定的标志来访问它们吗
感谢您的帮助
# 1 楼答案
当您在已经有jrt文件系统的JDK上运行时,您可以更轻松地访问另一个JDK的jrt文件系统
内置的文件系统将为外国JDK的jrt fs创建一个特殊的类加载器。不委托给该jar类的父加载程序的jar。因此,它不会再次以自己的方式结束
由于它使用了另一个JDK提供的实现,因此它将能够处理更新的特性,甚至是使用完全不同的数据格式存储模块的JDK