gpt4 book ai didi

Java 字符串可变性 - java.lang.NoSuchFieldException : offset

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:47:45 25 4
gpt4 key购买 nike

我是 Java 的新手,我看到了一个问答部分 here有两个例子,其中删除了可变性。经检测MutableString.java :

import java.lang.reflect.Field; 

public class MutableString {

public static void main(String[] args) {
String s = "Immutable";
String t = "Notreally";

mutate(s, t);
StdOut.println(t);

// strings are interned so this doesn't even print "Immutable" (!)
StdOut.println("Immutable");
}

// change the first min(|s|, |t|) characters of s to t
public static void mutate(String s, String t) {
try {
Field val = String.class.getDeclaredField("value");
Field off = String.class.getDeclaredField("offset");
val.setAccessible(true);
off.setAccessible(true);
int offset = off.getInt(s);
char[] value = (char[]) val.get(s);
for (int i = 0; i < Math.min(s.length(), t.length()); i++)
value[offset + i] = t.charAt(i);
}
catch (Exception e) { e.printStackTrace(); }
}

}

我收到以下错误:

java.lang.NoSuchFieldException: offset

如有任何意见,我们将不胜感激:

a) why do I get this exception
b) how do I check which fields exist in a class (Java strings specifically)

最佳答案

免责声明:这些技巧是有趣的学习类(class)和有趣的琐事。但它们绝对不是您想在任何生产代码中使用的东西。它导致疼痛。

就其本质而言,此类破解始终取决于被破解类的实现细节。

在您的情况下,您似乎正在使用一个没有 offset 字段的 String 实现,但使用了一些其他机制(或者可能只是一个不同的名称! ).

例如,我刚刚查看了 Oracle Java 7 String 类,它不再具有 offset 字段(在 Java 6 和更早版本中用于共享 char[] 在子串之间)!*

您可以使用 Class.getDeclaredFields() 来检查此实现确实定义了哪些字段:

for (Field f : String.class.getDeclaredFields()) {
System.out.println(f);
}

对于适用于 Java 7 的 hack 版本,您可以这样做:

public static void mutate(String s, String t) {
try {
Field val = String.class.getDeclaredField("value");
val.setAccessible(true);
char[] value = (char[]) val.get(s);
for (int i = 0; i < Math.min(s.length(), t.length()); i++)
value[i] = t.charAt(i);
}
catch (Exception e) { e.printStackTrace(); }
}

当然,如果 String 的内部再次发生变化,这也会中断。

* Here's an Email谈到这一变化,似乎共享 char[] 只会在少数特殊情况下提高性能。

关于Java 字符串可变性 - java.lang.NoSuchFieldException : offset,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17489467/

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