Предупреждение о недопустимой операции отражающего доступа в 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:

WARNING: An illegal reflective access operation has occurred WARNING: Illegal reflective access by com.lowagie.text.pdf.MappedRandomAccessFile$1 (file:/[local path removed from here]/openpdf.jar) to method java.nio.DirectByteBuffer.cleaner() WARNING: Please consider reporting this to the maintainers of com.lowagie.text.pdf.MappedRandomAccessFile$1 WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations WARNING: All illegal access operations will be denied in a future release

Библиотеку можно найти здесь: https://github.com/LibrePDF/OpenPDF

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

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

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

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
5 875
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

Can I replace the MappedRandomAccessFile class with some similar code in a supported Java library instead?

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

Другой вариант - дождаться, пока разработчики LibrePDF исправят это.

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


Немного покопавшись, я обнаружил следующее:

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

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

Я сопровождаю и нуждаюсь в помощи, чтобы понять и исправить эту проблему.

roschdal 08.09.2018 11:37

А ... ну ... я думаю, у вас серьезная проблема. Потому что мне кажется, что когда в «будущей версии» будет отказано в доступе к отражению, вы будете полагаться на команду OpenJDK, избавившуюся от необходимости вызывать Cleaner. (Я предполагаю, что вы знаете, что делает вызов очистки ... и понимаете, что мотивировало его включение в вашу базу кода.)

Stephen C 08.09.2018 12:24

Что нужно сделать в первую очередь, чтобы это исправить?

roschdal 08.09.2018 13:06

Другие вопросы по теме