当前位置: 首页 > 知识库问答 >
问题:

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

郑鸿朗
2023-03-14

如果能帮助我重写一些使用反射的Java代码,以便在Java10上删除编译器中的警告,我将不胜感激:

这就是所讨论的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上的问题html" target="_blank">代码:https://github.com/librepdf/openpdf/blob/master/openpdf/src/main/java/com/lowagie/text/pdf/mappedrandomaccessfile.java#l199

这是我在Java10上编译时得到的警告:

警告:发生了非法的反射访问操作警告: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

有什么关于如何以正确的方式解决这个问题的帮助吗?是否应该重写代码以不使用反射?我可以用支持的Java库中的一些类似代码代替MappedRandomAccessFile类吗?

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

提前道谢!

共有1个答案

魏君博
2023-03-14

我看到这个问题已经向库的维护人员反映过了;参见https://github.com/librepdf/openpdf/issues/101。

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

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

没有人会阻止你:-)但如果你是在要求一个推荐,那就离题了。

您的另一种选择是等待LibrePDF维护者修复它。

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

再挖一挖,我发现了这个:

  • https://bugs.java.com/view_bug.do?bug_id=jdk-6857566

这描述了一个问题,即GC对清洁工的呼叫可能没有“跟上”,导致早产儿。这个问题已经在Java9中得到了修复,并且该修复已经被重新补丁到Java8&7中。

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

 类似资料:
  • 我在Eclipse(版本2019-06)中运行一个项目,它在我的java计算机上运行得很好--“OpenJDK 1.8.0_222” 然而,当我尝试tor在Eclipse(版本2021-3)上的另一台计算机上用java运行该项目时--“OpenJDK版本”1.8.0_292“,它不起作用! 我得到以下错误: 警告:发生非法反射访问操作警告:com.google.gson.internal.bind

  • 在尝试构建时,。我按照其他人的建议添加了,但仍然得到相同的错误。 有什么建议吗? pom.xml

  • 我正在使用Apache POI处理excel文件,从Java9开始,我得到了这条消息,根据这篇文章JDK9:发生了非法的反射访问操作。pySystemState我们应该等待开发人员修复这个问题,但是我应该在新的生产版本中保留它吗?我想跳过警告应该没问题。

  • 我刚买了一台新电脑,决定开始尝试制作《我的世界》模型。超级新,不知道我在做什么,跟着导游走。 在过去的一个小时里,我一直在努力让它工作,我卸载了所有的东西,重新安装了所有的东西,重新启动了我的计算机,手动删除了更改了启动配置的JDK环境,任何我能想到的东西。 我在google上找到的所有其他实例都说我不需要以后安装JDK,我必须有JDK8,但我从来没有另一个版本。 如有任何帮助,不胜感激。

  • JDK11+spring批处理 有人知道那些警告是什么意思吗: 警告:发生了非法的反射访问操作警告:org.springframework.cglib.core.reflectutils$1(jar:file:/users/boru/downloads/spcljr/build/libs/spcljr-0.0.1-snapshot.jar!/boot-inf/lib/spring-core-5.0

  • 我试图使用Java9(JDK9)运行DMelt programs(http://jwork.org/DMelt/)程序,它给出了如下错误: 我该怎么修好它?我试图在脚本“dmelt.sh”的最后一行添加-illegal-access=permit(我在Linux中使用bash),但这并没有解决这个问题。我对此很沮丧。我经常使用这个程序,很长一段时间了。也许我永远不应该转到JDK9