簡體   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