Есть ли способ получить доступ к закрытому пакету String.isLatin1 () из java .util пакета, используя jdk.internal.access.SharedSecrets? - PullRequest
0 голосов
/ 05 февраля 2020

Я пытаюсь получить доступ к String.isLatin1(), который объявлен (начиная с JDK 14) как

boolean isLatin1() {
    return COMPACT_STRINGS && coder == LATIN1;
}

Я могу сделать это с помощью отражения

Method isLatin1 = String.class.getDeclaredMethod("isLatin1");
isLatin1.setAccessible(true);
isLatin1.invoke(""); //true

, но мне интересно Я могу сделать то же самое с SharedSecrets?

Я пробовал

SharedSecrets.getJavaLangAccess().getDeclaredPublicMethods(String.class, "isLatin1");

, но по понятной причине он возвращает пустой список. Также я пытался использовать jdk.internal.access.JavaLangReflectAccess, доступный из SharedSecredts, но у него нет подходящего метода.

1 Ответ

3 голосов
/ 05 февраля 2020

Это не сработает. Механизм общих секретов обеспечивает способ специфицировать c пакета приватных методов. Если вы посмотрите на исходный код, вы увидите, что существует интерфейс «доступа», который предоставляет фиксированный набор методов. Интерфейс общих секретов для пакета java.lang предоставляет некоторые методы для получения внутреннего байтового массива строки без его копирования. Но он не предоставляет метод, который делает то, что вы хотите.

Кроме того, метод isLatin1(), к которому вы пытаетесь получить доступ, - это private, а не пакет private, так что он все равно не может быть предоставлен. Если вы не измените это.

Короче говоря, вы не можете использовать SharedSecrets для этого, если вы не готовы изменить исходный код OpenJDK и создать свою собственную JVM . Это может быть приемлемо для эксперимента, но есть много красных флажков для производственного использования.

Использовать отражение. Это более практично ... по модулю, что вы рискуете вызвать проблемы переносимости в будущем для вашего приложения. (Учтите, что внутреннее представление String менялось 2 или 3 раза до сих пор с момента Java 1.1. Это может произойти снова.)

...