Чтение реестра Windows с помощью Java 11 - PullRequest
0 голосов
/ 28 ноября 2018

Я конвертирую приложение из 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...