有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何从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) 个答案

  1. # 1 楼答案

    当您在已经有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类的父加载程序的jar。因此,它不会再次以自己的方式结束

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