class MainClass
{
public static void main(String []args)
{
System.out.println("B");
}
}
通常上面的代码生成输出 B 。如何在不修改ABC
方法的情况下将其更改为main()
?
答案 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 。