Можно ли получить доступ к методам области пакета путем отражения в Java 9 с помощью Jigsaw?

У меня есть следующий код для получения URLStreamHandlers по умолчанию для http и https, который работает в Java 8, путем доступа к методу URL.getURLStreamHandler() статического пакета:

private URLStreamHandler getURLStreamHandler(String protocol) {
    try {
        Method method = URL.class.getDeclaredMethod("getURLStreamHandler", String.class);
        method.setAccessible(true);
        return (URLStreamHandler) method.invoke(null, protocol);
    } catch (Exception e) {
        logger.warning("could not access URL.getUrlStreamHandler");
        return null;
    }
}

Будет ли это по-прежнему возможно в Java 9 с помощью jigsaw или изменение видимости таким образом будет запрещенный?


person P.J.Meisch    schedule 09.04.2016    source источник
comment
Возможность получить к ним доступ через переопределение доступа может существовать, но поскольку закрытые для пакетов методы не являются частью официального API, нет никакой гарантии, что метод вообще будет существовать…   -  person Holger    schedule 16.06.2016


Ответы (1)


Раньше это было возможно в раннем прототипе, но сейчас это невозможно. Правила доступности Jigsaw теперь ограничивают доступ только к public элементам (типам, методам, полям).

В вашем примере вызов method.setAccessible(true) завершится ошибкой с сообщением, подобным этому:

java.lang.reflect.InaccessibleObjectException: невозможно сделать getURLStreamHandler доступным: модуль java.... не "открывает java...." для безымянного модуля @1941a8ff

См. этот вопрос, чтобы узнать, как это обойти.

person Nicolai Parlog    schedule 09.04.2016