Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java字符串易变性-Java.lang.NoSuchFieldException:偏移量_Java_String_Immutability_Field_Nosuchfieldexception - Fatal编程技术网

Java字符串易变性-Java.lang.NoSuchFieldException:偏移量

Java字符串易变性-Java.lang.NoSuchFieldException:偏移量,java,string,immutability,field,nosuchfieldexception,Java,String,Immutability,Field,Nosuchfieldexception,我是Java新手,我看到了一个问答部分,其中有两个示例,其中删除了可变性。测试后: 如对以下内容有任何意见,将不胜感激: a) 为什么会出现此异常 b) 如何检查类中存在哪些字段(特别是Java字符串) 免责声明:这些类型的黑客是有趣的学习课程和有趣的琐事。但是它们肯定不是您想要在任何生产代码中使用的东西。它会导致疼痛 就其本质而言,这种黑客行为总是依赖于被黑客攻击的类的实现细节 在您的例子中,您似乎使用的是一个字符串实现,它没有偏移量字段,但使用了一些其他机制(或者可能只是一个不同的名称!)

我是Java新手,我看到了一个问答部分,其中有两个示例,其中删除了可变性。测试后:

如对以下内容有任何意见,将不胜感激:

a) 为什么会出现此异常
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(); }
}