ofe*_*fer 3 java string field immutability nosuchfieldexception
我是Java的新手,我在这里看到了一个问答部分,其中有两个例子,其中删除了可变性.在测试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(); }
}
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
java.lang.NoSuchFieldException: offset
Run Code Online (Sandbox Code Playgroud)
以下任何输入将不胜感激:
a)为什么我会得到这个异常
b)如何检查类中存在哪些字段(具体是Java字符串)
Joa*_*uer 10
免责声明:这些黑客是学习和有趣的琐事的有趣课程.但它们绝对不是您想要在任何生产代码中使用的东西.它会导致疼痛.
就其本质而言,这样的黑客总是依赖于被黑客攻击的类的实现细节.
在您的情况下,您似乎使用的String是没有offset字段的实现,但使用其他一些机制(或者可能只是一个不同的名称!).
例如,我刚刚查看了Oracle Java 7 String类,它不再具有该offset字段(在Java 6及更早版本中用于共享char[]子字符串)!*
您可以使用Class.getDeclaredFields()来检查哪些字段此实现并定义:
for (Field f : String.class.getDeclaredFields()) {
System.out.println(f);
}
Run Code Online (Sandbox Code Playgroud)
对于适用于Java 7的黑客版本,您可以这样做:
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(); }
}
Run Code Online (Sandbox Code Playgroud)
当然,如果String再次改变内部,这也会破裂.
*这是一个谈论这种变化的电子邮件,似乎char[]只是在一些特殊情况下共享导致性能提高.
| 归档时间: |
|
| 查看次数: |
1287 次 |
| 最近记录: |