是否可以使用jdk.internal.access.SharedSecrets从java.util包访问包私有的String.isLatin1()?

问题描述 投票:0回答:1

我正在尝试将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,但是它没有任何合适的方法。

java unsafe
1个回答
3
投票

这是行不通的。共享机密机制提供了一种方法,用于特定打包私有方法。如果查看源代码,将会看到有一个“访问”接口,它公开了一组固定的方法。 java.lang程序包的共享机密接口公开了一些用于获取字符串内部字节数组而不进行复制的方法。但是它没有提供满足您需要的方法。

此外,您尝试访问的isLatin1()方法是private而不是包私有的,因此无论如何都无法公开它,除非您进行更改。

总之,除非您准备修改OpenJDK源代码并构建自己的JVM],否则不能使用SharedSecrets。>。可以将其作为实验来接受,但是有很多危险信号可供生产使用。

使用反射。以模为单位,可能会导致将来为您的应用程序带来可移植性问题,这是更实际的做法。 (考虑到String的内部表示,自Java 1.1以来已更改了2到3次。[有可能再次发生。]]

© www.soinside.com 2019 - 2024. All rights reserved.