Я был бы признателен за помощь в переписывании некоторого кода 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, и мне нужна помощь с этим)
Заранее спасибо!
Я вижу, что об этой проблеме уже было сообщено разработчикам библиотеки; см. 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, то вы должен сможете удалить его сейчас.
А ... ну ... я думаю, у вас серьезная проблема. Потому что мне кажется, что когда в «будущей версии» будет отказано в доступе к отражению, вы будете полагаться на команду OpenJDK, избавившуюся от необходимости вызывать Cleaner. (Я предполагаю, что вы знаете, что делает вызов очистки ... и понимаете, что мотивировало его включение в вашу базу кода.)
Что нужно сделать в первую очередь, чтобы это исправить?
Я сопровождаю и нуждаюсь в помощи, чтобы понять и исправить эту проблему.