[英]Itext Java 11: Illegal reflective access by com.itextpdf.io.source.ByteBufferRandomAccessSource$1
最近升级到Java 11并开始执行回归检查。 当前尝试调用com.itextpdf.text.pdf.PdfReader.close
时,会出现非法反射访问错误。 目前在Itext版本5.5.13上,但也尝试在itext 7.0.0上有同样的问题。
有没有人对如何修复Java-11和Itext之间的兼容性问题有任何建议?
警告:发生了非法反射访问操作警告:com.itextpdf.io.source.ByteBufferRandomAccessSource $ 1非法反射访问(文件:... repository / com / itextpdf / io / 7.0.0 / io-7.0.0.jar )方法java.nio.DirectByteBuffer.cleaner()警告:请考虑向com.itextpdf.io.source.ByteBufferRandomAccessSource $ 1的维护者报告此情况警告:使用--illegal-access = warn启用进一步非法反射访问的警告操作警告:将来的版本中将拒绝所有非法访问操作
我在第二条评论中鼓励您调试代码并查找根本原因(然后提交拉取请求),或者如果您是具有支持合同的客户(这将提高问题的优先级),则在iText Jira中创建问题),这是一个解决方案的建议(我没有测试过,但我有可能它会工作):
使用分别接受InputStream
和OutputStream
PdfReader
和PdfWriter
构造函数。 在这种情况下,不应调用导致问题的代码。 对于iText与文件系统交互的所有其他情况也是如此 - 将所有内容包装到InputStream
/ OutputStream
,或处理byte[]
数组。
所以这一行:
new PdfDocument(new PdfReader(inFilePath), new PdfWriter(outFilePath))
成为这个:
new PdfDocument(new PdfReader(new FileInputStream(inFilePath)),
new PdfWriter(new FileOutputStream(outFilePath)))
您可能还希望将流包装到BufferedInputStream
/ BufferedOutputStream
。
类似地,在处理PdfFontFactory
,使用接受byte[]
而不是表示文件路径的String
等等。
如果你很好奇非法反射访问是什么,请参考这里: 什么是非法反射访问
这个特别警告来自这个类:
从这个特殊的方法:
private static boolean clean(final java.nio.ByteBuffer buffer) {
if (buffer == null || !buffer.isDirect())
return false;
Boolean b = AccessController.doPrivileged(new PrivilegedAction<Boolean>() {
public Boolean run() {
Boolean success = Boolean.FALSE;
try {
// java 9
if (UNMAP_SUPPORTED)
CLEANER.freeBuffer(buffer.toString(), buffer);
// java 8 and lower
else {
Method getCleanerMethod = buffer.getClass().getMethod("cleaner", (Class<?>[]) null);
getCleanerMethod.setAccessible(true);
Object cleaner = getCleanerMethod.invoke(buffer, (Object[]) null);
Method clean = cleaner.getClass().getMethod("clean", (Class<?>[]) null);
clean.invoke(cleaner, (Object[]) null);
}
success = Boolean.TRUE;
} catch (Exception e) {
// This really is a show stopper on windows
Logger logger = LoggerFactory.getLogger(ByteBufferRandomAccessSource.class);
logger.debug(e.getMessage());
}
return success;
}
});
return b;
}
这一行完全符合:
getCleanerMethod.setAccessible(true);
只要此警告不会阻止iText按预期工作,我认为您可以做的最好的事情是向iText团队提交问题/ PR,并等待正确的修复程序可用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.