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");
}
}
一种解决方案是隐藏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");
}
}
}
你可以做到这一点,但它是一个可怕的黑客。
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 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");
}
}
技巧是在静态初始化程序中覆盖System.out
使用。System::setOut
因为您还没有将 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。