gpt4 book ai didi

使用 JDK9 获取 java.io.Serializable 时,Javassist NotFoundException

转载 作者:行者123 更新时间:2023-12-02 23:17:22 24 4
gpt4 key购买 nike

我有以下代码:

private static CtClass resolveCtClass(String clazz) throws NotFoundException {
ClassPool pool = ClassPool.getDefault();
return pool.get( clazz );
}

在JDK8环境下运行时,如果使用java.io.Serialized调用该方法,它可以工作,但在JDK9环境下运行时,会抛出NotFoundException

这里有什么我忽略的吗?

最佳答案

当前的 Java 9 EA 版本不会再发生这种情况。类文件现在始终是可定位的,即使它们封装在模块中也是如此。

这是 Java 9 模块封装的结果,其中未导出的资源不再可通过 ClassLoader API 获得。在幕后,Javassist 调用

ClassLoader.getSystemClassLoader().findResource("java/io/Serializable.class");

获取Serialized的类文件。然后,它解析该类文件并表示与 Java 反射 API 类似的信息,但不加载该类,以便可以在加载之前对其进行编辑。

在 Java 8 之前,此类文件是可以访问的,因为大多数类加载器依赖于在加载类文件之前查找类文件,这样上述调用就会返回指向该文件的 URL。从 Java 9 开始,命名模块的资源只能通过新的 API 方法 findResource(String, String) 获取,其中第二个参数命名该类的模块。

简短的回答是:Javassist 不再与 Java 9 一起工作,并且 its dependant projects 都不再工作。将要。这是 known issue使用当前的 Java 9 实现,并有望在发布之前得到修复。

关于使用 JDK9 获取 java.io.Serializable 时,Javassist NotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37892267/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com