繁体   English   中英

Itext Java 11:com.itextpdf.io.source.ByteBufferRandomAccessSource $ 1的非法反射访问

[英]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中创建问题),这是一个解决方案的建议(我没有测试过,但我有可能它会工作):

使用分别接受InputStreamOutputStream PdfReaderPdfWriter构造函数。 在这种情况下,不应调用导致问题的代码。 对于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等等。

如果你很好奇非法反射访问是什么,请参考这里: 什么是非法反射访问

这个特别警告来自这个类:

https://github.com/itext/itext7/blob/develop/io/src/main/java/com/itextpdf/io/source/ByteBufferRandomAccessSource.java

从这个特殊的方法:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM