[英]WARNING: An illegal reflective access operation has occurred (portable opencv in java)
[英]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.