Я конвертирую приложение из Java 8 в Java 11, что означает, что мне приходится иметь дело с модульной JRE.Процедура чтения раздела реестра Windows завершается с ошибкой InaccessableObjectException;сообщение java.lang.reflect.InaccessibleObjectException: Невозможно сделать закрытый длинный java.util.prefs.WindowsPreferences.openKey (byte [], int, int) доступным: модуль java.prefs не «открывает java.util.prefs»в модуль myModule.Файл module-info.java содержит инструкцию «Требуется java.prefs;».В приведенном ниже методе строка "openKey.setAccessible (true);"бросает исключение.Есть ли другое утверждение, которое я должен добавить в файл module-info.java?
public static String getRegistryValue(String key, String name, Logger log)
{
String vals = null;
//Retrieve a reference to the root of the system preferences tree
final Preferences systemRoot = Preferences.systemRoot();
final Class <?> clz = systemRoot.getClass();
try {
Class <?>[] params1 = {byte[].class, int.class, int.class};
final Method openKey = clz.getDeclaredMethod(
"openKey", params1);
openKey.setAccessible(true);
Class <?>[] params2 = {int.class};
final Method closeKey = clz.getDeclaredMethod(
"closeKey", params2);
closeKey.setAccessible(true);
final Method winRegQueryValue = clz.getDeclaredMethod(
"WindowsRegQueryValueEx",
int.class,
byte[].class);
winRegQueryValue.setAccessible(true);
int hKey = (Integer) openKey.invoke(systemRoot,
toByteEncodedString(key),
KEY_READ,
KEY_READ);
byte[] valb = (byte[]) winRegQueryValue.invoke(systemRoot, hKey,
toByteEncodedString(name));
vals = (valb != null ? new String(valb).trim() : null);
closeKey.invoke(Preferences.systemRoot(), hKey);
}
catch (Exception e) {
log.log(Level.SEVERE, "getRegistryValue failed for " +
key + "\\" + name);
JFrame frame = new JFrame();
JOptionPane.showMessageDialog(frame, "Event viewer cannot be opened.",
"error", JOptionPane.ERROR_MESSAGE);
}
return vals;
}