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

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

4

6 回答 6

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

    public static void main(String []args)
    {
        System.out.println("B");
    }
}
于 2013-01-03T10:51:55.637 回答
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");
        }
    }
}
于 2013-01-03T10:41:36.357 回答
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");
    }
}
于 2013-01-03T10:41:11.427 回答
2

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

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

}
于 2013-01-03T10:44:40.247 回答
1

技巧是在静态初始化程序中覆盖System.out使用。System::setOut

于 2013-01-03T10:40:51.860 回答
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。将调用子类的 main 方法,该方法将打印ABC

于 2013-01-10T05:34:41.057 回答