我有以下代码:
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.
有没有我忽略的东西?
现在的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实现的已知问题,并且有望在发布之前得到修复.
| 归档时间: |
|
| 查看次数: |
991 次 |
| 最近记录: |