Предупреждение о недопустимой отражающей операции доступа в Java 10 - PullRequest
0 голосов
/ 08 сентября 2018

Буду признателен за помощь в переписывании некоторого кода 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

Любая помощь о том, как это исправить правильно? Следует ли переписать код, чтобы не использовать отражение? Могу ли я заменить класс MappedRandomAccessFile некоторым похожим кодом в поддерживаемой библиотеке Java вместо этого?

(я один из сопровождающих OpenPDF, и мне нужна помощь с этим)

Заранее спасибо!

1 Ответ

0 голосов
/ 08 сентября 2018

Я вижу, что эта проблема уже была сообщена сопровождающим библиотеки; см https://github.com/LibrePDF/OpenPDF/issues/101.

Пока вы можете игнорировать сообщение, так как это всего лишь предупреждение.

Могу ли я заменить класс MappedRandomAccessFile некоторым похожим кодом в поддерживаемой библиотеке Java?

Никто не остановит вас :-) Но если вы просите рекомендацию, это не по теме.

Другой вариант - подождать, пока сопровождающие LibrePDF исправят это.

Однако я подозреваю, что они не ... потому что не могут. Вам следует взглянуть на этот неразрешенный отчет об ошибках Java за 2005 год: https://bugs.java.com/bugdatabase/view_bug.do?bug_id=4724038. Я думаю, это означает, что MappedRandomAccessFile можно исправить только путем исправления ошибки Java ..., которая делает недопустимый вызов cleaner() ненужно.


После еще нескольких копаний я нашел это:

Это описывает проблему, когда GC мог призвать уборщика не «идти в ногу», что привело к преждевременным OOME. Это было исправлено в Java 9, а исправление было исправлено в Java 8 & 7.

Что вам нужно сделать, это просмотреть историю и проблемы вашей кодовой базы и попытаться выяснить, почему «чистый» код был включен в ваш класс MappedRandomAccessFile. Если это было прежде всего для решения проблемы JDK-6857566, то вы должны быть в состоянии удалить его сейчас.

...