2014-04-21 154 views
4

最近我在出席的一次採訪中詢問了這個問題。在不修改代碼的情況下更改輸出

public class MagicOutput { 
    public static void main(final String argv[]) { 
     System.out.println("Hello, World!"); 
    } 
} 

我被要求保留這兩種方法主要簽名(名稱,數量和參數類型,返回類型)和實現(方法體),

,並讓這個節目輸出到標準控制檯消息"Magic Output !"

我花了大約2分鐘回答。我的解決方案是在那裏放置一個靜態塊並輸出所需的字符串。

static{ 
    System.out.println("Magic Output !"); 
} 

這不工作,但是,它打印既Magic Output !Hello, World!

我怎樣才能使它只輸出字符串魔法?

回答

9
static{ 
    System.out.println("Magic Output !"); 
    System.exit(0); 
} 

或有趣(取決於字符串實現 - 用的openjdk 8作品):

static { 
    System.out.println("Magic Output!"); 
    try { 
    Field f = String.class.getDeclaredField("value"); 
    f.setAccessible(true); 
    f.set("Hello, World!", new char[0]); 
    f.set(System.lineSeparator(), new char[0]); 
    } catch (Exception ignore) { } 
} 
+0

很好的答案在短時間內!我想投票10次。 – mok

+0

ahhh ...很酷..謝謝!愛你 – XTop

0

重定向的System.out到靜態塊上使用System.setOut()的PrintStream的實例。

1

你也可以使用靜態嵌套類來實現。

public class MagicOutput { 
    public static void main(final String argv[]) { 
     System.out.println("Hello, World!"); 
    } 
    static class System { 
     static Out out = new Out(); 
    } 
    static class Out { 
     void println(String s){ 
      java.lang.System.out.println("Magic Output !"); 
     } 
    } 
} 
相關問題