2013-01-03 61 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