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

1 つの解決策は非表示に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");
        }
    }
}
于 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 も : 静的初期化ブロックを使用し、出力ストリームを基本的に何も設定しない。

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

MainClass を公開していないためです。だからここにもう1つあります:

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が出力されます。

于 2013-01-10T05:34:41.057 に答える
1

トリックは、静的初期化子でSystem.out使用してオーバーライドすることです。System::setOut

于 2013-01-03T10:40:51.860 に答える