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

Nar*_*ros 7 javassist java-9

我有以下代码:

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

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

有没有我忽略的东西?

Raf*_*ter 7

现在的Java版本的Java 9不再发生这种情况.类文件现在总是可以定位的,即使它们被封装在模块中也是如此.

这是Java 9模块封装的结果,其中不再通过ClassLoaderAPI 提供未导出的资源.在封面下,Javassist打电话

ClassLoader.getSystemClassLoader().findResource("java/io/Serializable.class");
Run Code Online (Sandbox Code Playgroud)

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

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

简短的回答是:Javassist不再使用Java 9,它的任何依赖项目都不会.这是当前Java 9实现的已知问题,并且有望在发布之前得到修复.