gpt4 book ai didi

java - 有没有办法使用 jdk.internal.access.SharedSecrets 从 java.util 包访问包私有(private) String.isLatin1() ?

转载 作者:行者123 更新时间:2023-12-01 19:29:54 51 4
gpt4 key购买 nike

我正在尝试访问被声明为(从 JDK 14 开始)的 String.isLatin1()

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");

但由于显而易见的原因,它返回一个空列表。另外,我尝试利用 SharedSecredts 中提供的 jdk.internal.access.JavaLangReflectAccess,但它没有任何合适的方法。

最佳答案

这是行不通的。共享 secret 机制提供了一种封装特定私有(private)方法的方法。如果你查看源代码,你会发现有一个“访问”接口(interface),公开了一组固定的方法。 java.lang 包的共享 secret 接口(interface)公开了一些获取字符串内部字节数组而不复制它的方法。但它没有提供执行您想要的操作的方法。

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

简而言之,除非您准备修改 OpenJDK 源代码并构建自己的 JVM,否则您不能使用 SharedSecrets 来实现此目的。作为实验这样做可能是可以接受的,但在生产使用中存在很多危险信号。

使用反射。它更实用......模数您可能会导致应用程序 future 出现可移植性问题。 (考虑一下,自 Java 1.1 以来,String 的内部表示形式到目前为止已经更改了 2 到 3 次。这种情况可能会再次发生。)

关于java - 有没有办法使用 jdk.internal.access.SharedSecrets 从 java.util 包访问包私有(private) String.isLatin1() ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60075337/

51 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com