String args []参数

时间:2013-01-03 10:30:30

标签: java string command-line-arguments

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

通常上面的代码生成输出 B 。如何在不修改ABC方法的情况下将其更改为main()

6 个答案:

答案 0 :(得分:13)

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

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

答案 1 :(得分:12)

一种解决方案是隐藏System.out - 下面的代码打印ABC而不更改main:

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

答案 2 :(得分: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");
    }
}

答案 3 :(得分:2)

Ugly Hack:通过使用静态初始化块并将输出流设置为基本没有。

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

}

答案 4 :(得分:1)

欺骗是使用静态初始化程序中的System::setOut覆盖System.out

答案 5 :(得分: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