2011-11-10 23 views
6

以下簡單的Java程序似乎通過語句System.out.println("Hello World");顯示字符串Hello World,但它沒有。它只是用另一個字符串代替,在這種情況下,美好的一天!並將其顯示在控制檯上。字符串Hello World完全不顯示。讓我們看一下Java中的以下簡單代碼片段。簡單的Java代碼運行良好,但功能有點難以遵循

package goodday; 

import java.lang.reflect.Field; 

final public class Main 
{ 
    public static void main(String[] args) 
    {   
     System.out.println("Hello World"); 
    } 

    static 
    { 
     try 
     { 
      Field value = String.class.getDeclaredField("value"); 
      value.setAccessible(true); 
      value.set("Hello World", value.get("Good Day !!")); 
     } 
     catch (Exception e) 
     { 
      throw new AssertionError(e); 
     } 
    } 
} 

關於這裏的代碼只有一個問題。它工作正如預期,但我不能減少字符串的長度美好的一天!。如果嘗試這樣做,它會導致java.lang.ArrayIndexOutOfBoudsException。如果長度增加,程序運行良好,但顯示字符串中的其餘字符被截斷意味着兩個字符串的長度應該有些相同。爲什麼?這是我無法理解的事情。

+3

當然,您意識到您永遠不應該在真正的代碼中這樣做嗎? –

+2

我知道很久以前的Java了,但從來沒有見過這樣的先知,真的很好的問題:D –

回答

7

value字段是char[],它在內部存儲字符串用作其後備存儲的字符數組。其他字段表示字符數組的初始偏移量和字符串的長度。 (所以取子串,它只是創建一個新的String對象是指同一char[]但使用不同的起始偏移和長度。)

如果修改這些字段,以及,你可以做幾乎任何你喜歡與字符串。示例:

import java.lang.reflect.Field; 

public class Test 
{ 
    // Obviously in real code you wouldn't use Exception like this... 
    // Although hacking string values with reflection is worse, of course. 
    public static void main(String[] args) throws Exception 
    {   
     System.out.println("Hello World"); 
     replaceHelloWorld("Goodbye!"); 
     System.out.println("Hello World"); 
     replaceHelloWorld("Hello again!"); 
     System.out.println("Hello World"); 
    } 

    static void replaceHelloWorld(String text) throws Exception 
    { 
     // Note: would probably want to do hash as well... 
     copyField(text, "Hello World", "value"); 
     copyField(text, "Hello World", "offset"); 
     copyField(text, "Hello World", "count"); 
    } 

    static void copyField(String source, String target, String name) 
     throws Exception 
    { 
     Field field = String.class.getDeclaredField(name); 
     field.setAccessible(true); 
     field.set(target, field.get(source)); 
    } 
} 
+2

你應該知道比鼓勵這個更好...... :-) –

相關問題