class MainClass
{
public static void main(String []args)
{
System.out.println("B");
}
}
通常、上記のコードは出力Bを生成します。ABC
メソッドを変更せずに変更するにはどうすればよいmain()
ですか?
class MainClass
{
public static void main(String []args)
{
System.out.println("B");
}
}
通常、上記のコードは出力Bを生成します。ABC
メソッドを変更せずに変更するにはどうすればよいmain()
ですか?
public class Test
{
static
{
System.out.println("ABC");
System.exit(0);
}
public static void main(String []args)
{
System.out.println("B");
}
}
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");
}
}
}
あなたはこれを行うことができますが、それは恐ろしいハックです.
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");
}
}
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");
}
}
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が出力されます。
トリックは、静的初期化子でSystem.out
使用してオーバーライドすることです。System::setOut