2013-01-03 66 views
3
class MainClass 
{ 
    public static void main(String []args) 
    { 
     System.out.println("B"); 
    } 
} 

通常上述代碼生成輸出。我如何在不修改main()方法的情況下將其更改爲ABC字符串ARGS []參數

+1

你不能,除非你傳遞你想要打印的值。 – duffymo

+0

你不行。你*可以*使用靜態初始化器打印「A」,但是對於「C」AFAICS你沒有辦法做。 –

+0

你爲什麼要更改代碼而不更改代碼? –

回答

13
public class Test 
{ 
    static 
    { 
    System.out.println("ABC"); 
    System.exit(0); 
    } 

    public static void main(String []args) 
    { 
     System.out.println("B"); 
    } 
} 
+1

效率很高! – assylias

+0

真的很「好」 –

+0

@Xavier:那真的很好,很簡單。感謝您的解決方案。 – Gapchoos

1

訣竅是在靜態初始化器中使用System::setOut覆蓋System.out

9

你可以做到這一點,但它是一個可怕的黑客。

import java.lang.reflect.Field; 

class MainClass { 
    // requires Java 7 update 5+ as the internal structure of String changed. 
    static { 
     try { 
      Field value = String.class.getDeclaredField("value"); 
      value.setAccessible(true); 
      value.set("B", value.get("ABC")); 
     } catch (Throwable e) { 
      throw new AssertionError(e); 
     } 
    } 
    public static void main(String[] args) { 
     System.out.println("B"); 
    } 
} 
+0

感謝您的解決方案。但我想接受的答案很簡單 – Gapchoos

+3

@Gapchoos從技術上講,該解決方案不運行給定的代碼。你可以運行一個不相關的課程;) –

12

一種解決方案是隱藏System.out - 下面的代碼打印ABC而不改變主:

class MainClass { 

    public static void main(String[] args) { 
     System.out.println("B"); 
    } 

    static class System { 
     static Printer out = new Printer(); 
    } 
    static class Printer { 
     public void println(String whatever) { 
      java.lang.System.out.println("ABC"); 
     } 
    } 
} 
+0

很高興你回覆。被接受的答案比較簡單。 – Gapchoos

2

醜陋的黑客也:通過使用靜態初始化塊和所述輸出流設置爲基本上沒有什麼。

package pack; 

import java.io.IOException; 
import java.io.OutputStream; 
import java.io.PrintStream; 


class MainClass 
{ 
    static { 
     System.out.print("ABC"); 
     try { 
      System.setOut(new PrintStream(new OutputStream() { 

       @Override 
       public void write(int b) throws IOException { 

       } 
      })); 
     } catch (Exception e) { 
     } 


    } 
      public static void main(String []args) 
      { 
        System.out.println("B"); 
      } 

} 
1

當你還沒有MainClass公衆。所以這裏有一個:

class MainClass { 
    public static void main(String[] args) { 
     System.out.println("B"); 
    } 
} 

public class SubClass extends MainClass{ 
    public static void main(String[] args){ 
     System.out.println(" ABC"); 
    } 
} 

將上面的代碼保存爲SubClass.java。子類的主要方法將被調用,將打印ABC