Java 10 中非法反射访问操作警告

3

我需要一些帮助来重写一些使用反射的Java代码,以消除Java 10编译器的警告:

这是相关的Java方法:

public static boolean clean(final java.nio.ByteBuffer buffer) {
    if (buffer == null || !buffer.isDirect())
        return false;

    Boolean b = (Boolean) AccessController.doPrivileged(new PrivilegedAction() {
        public Object run() {
            Boolean success = Boolean.FALSE;
            try {
                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
                //e.printStackTrace();
            }
            return success;
        }
    });

    return b.booleanValue();
}

这是在GitHub上的相关代码:https://github.com/LibrePDF/OpenPDF/blob/master/openpdf/src/main/java/com/lowagie/text/pdf/MappedRandomAccessFile.java#L199

这是我在Java 10编译时收到的警告:

警告:发生非法反射访问操作 警告:com.lowagie.text.pdf.MappedRandomAccessFile$1 (file:/[local path removed from here]/openpdf.jar) 对 java.nio.DirectByteBuffer.cleaner() 方法的非法反射访问 警告:请考虑将此报告给 com.lowagie.text.pdf.MappedRandomAccessFile$1 的维护者 警告:使用 --illegal-access=warn 选项可以启用进一步的非法反射访问警告 警告:所有非法访问操作都将在未来的版本中被拒绝

该库可以在这里找到:https://github.com/LibrePDF/OpenPDF

有关如何以正确的方式修复此问题的任何帮助?应该重写代码以不使用反射吗?我能否将MappedRandomAccessFile类替换为支持的Java库中的某些类似代码?

(我是OpenPDF的维护者之一,需要一些帮助)

提前感谢!

1个回答

5
我看到这个问题已经报告给了该库的维护者; 请参见https://github.com/LibrePDF/OpenPDF/issues/101
目前,您可以忽略此消息,因为它只是一个警告。

我能否用某个受支持的Java库中的类替换MappedRandomAccessFile类呢?

没有人会阻止你 :-) 但是如果你在寻求建议,那就是离题了。
您的另一个选择是等待LibrePDF维护人员修复它。
然而,我怀疑他们不会......因为他们不能。您应该查看这个未解决的Java Bug报告(2005年):https://bugs.java.com/bugdatabase/view_bug.do?bug_id=4724038。我认为这意味着MappedRandomAccessFile只能通过修复Java bug来修复......这将使对cleaner()的非法调用变得不必要。
稍微再深入一点,我找到了这个: 这描述了一个问题,即GC调用清理程序无法“跟上”,导致过早的OOME。这在Java 9中已得到修复,并已被反向修补到Java 8和7。
您需要检查代码库的历史记录和问题,并尝试弄清楚为什么在您的MappedRandomAccessFile类中包含了“cleaner”代码。如果主要是为了解决JDK-6857566的问题,那么现在您应该能够将其删除。

1
我是维护者,需要一些帮助来理解和修复这个问题。 - roschdal
啊...嗯...我认为你有一个严重的问题。因为在“未来版本”中拒绝反射访问时,你将依赖于OpenJDK团队消除对清理程序调用的需求。(我假设你知道清理程序调用正在做什么...并且你了解在你的代码库中包含它的动机。) - Stephen C
修复这个问题的第一步是什么? - roschdal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接