【发布时间】:2013-07-05 12:56:18
【问题描述】:
我是 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) 为什么我会得到这个异常
b) 如何检查类中存在哪些字段(特别是 Java 字符串)
【问题讨论】:
-
类
offset中没有字段String... -
这种做事方式太恶心了-.-
-
@LaurentG:在 Java 6 中(或至少在 Oracle/Sun/OpenJDK 实现中)曾经有一个。当然,它从未被记录在案,因此取决于它显然是一个错误。
标签: java string immutability field nosuchfieldexception