繁体   English   中英

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

[英]Illegal reflective access operation warning in Java 10

我希望提供一些帮助来重写一些使用反射的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(文件:/ [从此处删除的本地路径] /openpdf.jar)对方法java.nio.DirectByteBuffer.cleaner的非法反射访问()警告:请考虑将此报告给com.lowagie.text.pdf.MappedRandomAccessFile $ 1的维护者。警告:使用--illegal-access = warn可以发出警告,警告进一步的非法反射访问操作警告:所有非法访问操作都将被拒绝在将来的版本中

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

关于如何正确解决此问题的任何帮助? 应该将代码重写为不使用反射吗? 我可以在支持的Java库中用一些类似的代码替换MappedRandomAccessFile类吗?

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

提前致谢!

我看到这个问题已经报告给图书馆的维护者了。 参见https://github.com/LibrePDF/OpenPDF/issues/101

目前,您可以忽略该消息,因为它只是一个警告。

我可以在支持的Java库中用一些类似的代码替换MappedRandomAccessFile类吗?

没有人会阻止您:-)但是,如果您要提出建议,那是不合时宜的。

您的另一种选择是等待LibrePDF维护人员对其进行修复。

但是,我怀疑他们不会...因为他们做不到。 您应该看看2005年以来未解决的Java Bug报告: https : //bugs.java.com/bugdatabase/view_bug.do?bug_id=4724038 我认为这意味着只能通过修复Java错误来修复MappedRandomAccessFile ...这将使对MappedRandomAccessFile cleaner()的非法调用变得不必要。


经过更多的挖掘,我发现了这一点:

这描述了一个问题,GC调用清洁器可能无法“保持”,从而导致OOME过早。 此问题已在Java 9中修复,并且此修复程序已回补到Java 8&7。

您需要做的是检查代码库的历史记录和问题,并尝试弄清楚为什么MappedRandomAccessFile类中包含“更干净的”代码。 如果主要是为了解决JDK-6857566的问题,那么您现在应该可以将其删除。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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