Java字符串易变性-Java.lang.NoSuchFieldException:偏移量
我是Java新手,我看到了一个问答部分,其中有两个示例,其中删除了可变性。测试后: 如对以下内容有任何意见,将不胜感激: a) 为什么会出现此异常Java字符串易变性-Java.lang.NoSuchFieldException:偏移量,java,string,immutability,field,nosuchfieldexception,Java,String,Immutability,Field,Nosuchfieldexception,我是Java新手,我看到了一个问答部分,其中有两个示例,其中删除了可变性。测试后: 如对以下内容有任何意见,将不胜感激: a) 为什么会出现此异常 b) 如何检查类中存在哪些字段(特别是Java字符串) 免责声明:这些类型的黑客是有趣的学习课程和有趣的琐事。但是它们肯定不是您想要在任何生产代码中使用的东西。它会导致疼痛 就其本质而言,这种黑客行为总是依赖于被黑客攻击的类的实现细节 在您的例子中,您似乎使用的是一个字符串实现,它没有偏移量字段,但使用了一些其他机制(或者可能只是一个不同的名称!)
b) 如何检查类中存在哪些字段(特别是Java字符串) 免责声明:这些类型的黑客是有趣的学习课程和有趣的琐事。但是它们肯定不是您想要在任何生产代码中使用的东西。它会导致疼痛 就其本质而言,这种黑客行为总是依赖于被黑客攻击的类的实现细节 在您的例子中,您似乎使用的是一个
字符串
实现,它没有偏移量
字段,但使用了一些其他机制(或者可能只是一个不同的名称!)
例如,我刚刚回顾了OracleJava7字符串类,它不再有offset
字段(在Java6和更早版本中用于在子字符串之间共享char[]
)*
您可以使用Class.getDeclaredFields()
检查此实现定义了哪些字段:
对于使用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(); }
}
publicstaticvoidmutate(字符串s,字符串t){
试一试{
字段val=String.class.getDeclaredField(“值”);
val.setAccessible(true);
char[]值=(char[])val.get;
对于(int i=0;i
当然,如果String
的内部结构再次发生变化,这也会中断
*说到这一变化,似乎共享
char[]
只能在少数特殊情况下提高性能。类字符串中没有字段offset
…这是一种令人厌恶的做事方式。-@LaurentG:Java 6中曾经有一种(或者至少在Oracle/Sun/OpenJDK实现中是这样)。当然,它从未被记录在案,因此依赖它显然是一个bug。谢谢。我还获得了初学者+15的声誉,因此我最终可以获得良好的响应。
java.lang.NoSuchFieldException: offset
for (Field f : String.class.getDeclaredFields()) {
System.out.println(f);
}
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(); }
}