如何从JDK15中提取java预览类文件?

如何从JDK15中提取java预览类文件?,java,java-15,Java,Java 15,我目前正试图从jrt-fs.jar(在libs文件夹中)中从jdk中提取预览类文件,如java.lang.Record,但在对其进行迭代时,它找不到预览类,如Record。这是我正在使用的代码: Path jrtFsJar = jdk15Home.resolve("lib").resolve("jrt-fs.jar"); jrtFsJarLoader = new URLClassLoader(new URL[] {jrtFsJar.toUri().toUR

我目前正试图从jrt-fs.jar(在libs文件夹中)中从jdk中提取预览类文件,如java.lang.Record,但在对其进行迭代时,它找不到预览类,如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);
我还尝试了更直接的方法:

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中提取记录类?预览类是在它里面,还是我应该在其他地方寻找它们?我需要一个特定的标志来访问它们吗


非常感谢您的帮助。

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

FileSystem jrtFs=FileSystems.newFileSystem(
create(“jrt:/”),Map.of(“java.home”,jdk15Home.toString());
byte[]object=Files.readAllBytes(
getPath(“modules”、“java.base”、“java/lang/Record.class”);
内置文件系统将为外部JDK的jrt-fs.jar创建一个特殊的类加载器,该加载器不会委托给该jar类的父加载器。因此,它不会再次以自己的方式结束


由于它使用了另一个JDK提供的实现,因此它将能够处理更新的功能,甚至是使用完全不同的数据格式作为其模块存储的JDK。

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

FileSystem jrtFs=FileSystems.newFileSystem(
create(“jrt:/”),Map.of(“java.home”,jdk15Home.toString());
byte[]object=Files.readAllBytes(
getPath(“modules”、“java.base”、“java/lang/Record.class”);
内置文件系统将为外部JDK的jrt-fs.jar创建一个特殊的类加载器,该加载器不会委托给该jar类的父加载器。因此,它不会再次以自己的方式结束


因为它使用了另一个JDK提供的实现,它将能够使用完全不同的数据格式处理较新的功能甚至jdk作为其模块存储。

使用macOS并将此代码放在测试类下,我无法使用
/Library/Java/JavaVirtualMachines/jdk-15.jdk/Contents/Home/bin/Java复制该测试类——启用预览-p/Users/naman.nigam/Desktop/namannigam/a-bit-of-problemsolving/target/classes-m a.bit.of.problem.solving/edu.bit.problemsolving.basic.AccessTest
既然您提到了这一点,问题可能在于我正在使用jdk-9阅读jdk-15 jrt-fs.jar。问题是,我使用的应用程序是jdk-9,而我需要分析所有java代码,包括现在的jdk-15代码。我已经用我正在使用的代码更新了这个bug。预览功能支持是在JDK的第12版开始时引入的,所以这似乎证明了为什么JDK-9目前会失败。也就是说,我不确定您寻求解决的类的兼容性。i、 e使用JDK-12,您是否能够识别
记录
。(但是,是的,如果我能尝试一下,我会分享结果。)好的,我明白发生了什么。据我所知,JDK只能读取运行时JDK的jrt:(对我来说是jdk9),而不能从另一个JDK的文件中读取。所以我要做的是启动一个OS进程,启动JDK-15并在本地收集列表。感谢您的帮助。使用macOS并将此代码放在测试类下,我无法使用
/Library/Java/JavaVirtualMachines/jdk-15.jdk/Contents/Home/bin/Java--启用预览-p/Users/naman.nigam/Desktop/namannigam/a-bit-of-problemsolving/target/classes-ma.bit.of.problem.solving/edu.bit.problemsolving.basic.AccessTest立即进行测试您提到的问题可能是,我正在使用jdk-9阅读jdk-15JRT-fs.jar。问题是,我使用的应用程序是jdk-9,而我需要分析所有java代码,包括现在的jdk-15代码。我已经用我正在使用的代码更新了这个bug。预览功能支持是在JDK的第12版开始时引入的,所以这似乎证明了为什么JDK-9目前会失败。也就是说,我不确定您寻求解决的类的兼容性。i、 e使用JDK-12,您是否能够识别
记录
。(但是,是的,如果我能尝试一下,我会分享结果。)好的,我明白发生了什么。据我所知,JDK只能读取运行时JDK的jrt:(对我来说是jdk9),而不能从另一个JDK的文件中读取。所以我要做的是启动一个OS进程,启动JDK-15并在本地收集列表。谢谢你的帮助。
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"));