2011-11-10 27 views
6

Chương trình Java đơn giản sau đây xuất hiện để hiển thị chuỗi Xin chào thế giới thông qua tuyên bố System.out.println("Hello World"); nhưng không. Nó chỉ đơn giản là thay thế này bằng một chuỗi khác trong trường hợp này, Ngày tốt !! và hiển thị nó trên bảng điều khiển. Chuỗi Hello World không hiển thị. Hãy xem đoạn mã đơn giản sau đây trong Java.Một mã Java đơn giản hoạt động tốt nhưng chức năng theo cách hơi khó theo dõi

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); 
     } 
    } 
} 

Chỉ cần một câu hỏi về mã này ở đây. Nó hoạt động chính xác như mong đợi nhưng tôi không thể giảm độ dài của chuỗi Ngày tốt !!. Nếu một nỗ lực được thực hiện để làm như vậy, nó gây ra một java.lang.ArrayIndexOutOfBoudsException. Nếu độ dài được tăng lên, chương trình chạy tốt nhưng phần còn lại của các ký tự trong chuỗi hiển thị bị cắt ngắn có nghĩa là độ dài của cả hai chuỗi phải giống nhau. Tại sao? Đây là điều mà tôi không thể hiểu được.

+3

Tất nhiên bạn nhận ra rằng bạn không bao giờ nên làm điều này bằng mã thực? –

+2

Tôi biết Java trong một thời gian dài, nhưng không bao giờ thấy smth như thế này trước đây, câu hỏi thực sự tốt: D –

Trả lời

7

Trường valuechar[] lưu trữ nội bộ mảng ký tự mà chuỗi này sử dụng làm cửa hàng sao lưu của nó. Các trường khác cho biết độ lệch ban đầu vào mảng ký tự và độ dài của chuỗi. (Vì vậy, để lấy một chuỗi con, nó chỉ tạo ra một đối tượng String mới đề cập đến cùng một char[] nhưng với độ lệch và chiều dài bắt đầu khác nhau.)

Nếu bạn sửa đổi các trường đó, bạn có thể làm khá nhiều thứ bạn thích với chuỗi. Ví dụ:

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

Bạn nên biết tốt hơn để khuyến khích này ... :-) –

Các vấn đề liên quan