如何解决使用iText PDF FontFactory.registerDirectories和Java 11的非法反射访问操作警告
使用iText PDF Illegal reflective access operation
和FontFactory.registerDirectories()
是否可以避免Java 11
警告?
重现问题的步骤:
- 安装
OpenJDK 11
。 - 将
iText PDF
库v5.5.13.2
添加到您的Java项目中。 - 致电
com.itextpdf.text.FontFactory.registerDirectories()
。 - 请参阅警告:
WARNING: An illegal reflective access operation has occurred WARNING: Illegal reflective access by com.itextpdf.text.io.ByteBufferRandomAccessSource$1 to method java.nio.DirectByteBuffer.cleaner() WARNING: Please consider reporting this to the maintainers of com.itextpdf.text.io.ByteBufferRandomAccessSource$1 WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations WARNING: All illegal access operations will be denied in a future release
通过Java 11和Gradle here查看poc。
解决方法
唯一的干净解决方案是,一旦存在新版本,则切换到不执行此非法反射访问的新版本。
作为临时解决方法,您可以使用
package com.example;
import org.junit.Test;
import com.itextpdf.text.FontFactory;
import org.junit.BeforeClass;
public class FontFactoryTest {
@BeforeClass
public static void prepare() {
Module mod = FontFactory.class.getClassLoader().getUnnamedModule();
if(mod == FontFactory.class.getModule()) {
Object.class.getModule().addOpens("java.nio",mod);
}
}
@Test
public void test() {
FontFactory.registerDirectories();
}
}
仅当代码被放置在未命名的模块中(通过类路径而不是模块路径加载)并且默认情况下,只要JDK授予反射访问权限时,此方法才起作用(预计将来会更改)
否则,您可能需要在命令行上使用-add-opens
选项或类似的选项(假设特定的执行环境具有这样的选项),但仍不能保证它可以正常工作,因为这意味着可以访问在特定的实现中根本不需要在那里的成员。
如果模块本身没有权限,则无法添加“打开”边缘。之所以能奏效,是因为从java.base
模块到未命名模块的“打开”边缘已经存在,只是在此警告中加以补充。上面的代码利用此权限来添加显式的“打开”边缘,该边缘未与警告链接。如前所述,这只是一个临时解决方法,它将在以后的版本中停止工作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。