如果能帮助我重写一些使用反射的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的维护者之一,需要一些帮助)
提前道谢!
我看到这个问题已经向库的维护人员反映过了;参见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()
的非法调用变得不必要。
再挖一挖,我发现了这个:
这描述了一个问题,即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