无需修改代码即可更改输出

时间:2014-04-21 12:41:40

标签: java

最近在我参加的一次采访中询问了这个问题。

public class MagicOutput { 
   public static void main(final String argv[]) { 
      System.out.println("Hello, World!"); 
   } 
}

我被要求保留方法主要签名(名称,参数的数量和类型,返回类型)和实现(方法体),

并使该程序输出到标准控制台消息"Magic Output !"

我花了大约2分钟回答。我的解决方案是在那里放置一个静态块并输出所需的字符串。

static{
   System.out.println("Magic Output !");
}

这确实有效,但它会同时打印Magic Output !Hello, World!

如何让它只输出魔法字符串?

3 个答案:

答案 0 :(得分:9)

static{
   System.out.println("Magic Output !");
   System.exit(0);
}

或funnier(取决于String实现 - 与openjdk 8一起使用):

static {
  System.out.println("Magic Output!");
  try {
    Field f = String.class.getDeclaredField("value");
    f.setAccessible(true);
    f.set("Hello, World!", new char[0]);
    f.set(System.lineSeparator(), new char[0]);
  } catch (Exception ignore) { }
}

答案 1 :(得分:1)

您也可以使用静态嵌套类来实现这一目标。

public class MagicOutput {   
    public static void main(final String argv[]) { 
        System.out.println("Hello, World!"); 
    }   
    static class System {
        static Out out = new Out();
    }
    static class Out {
        void println(String s){
            java.lang.System.out.println("Magic Output !");
        }
    }
}

答案 2 :(得分:0)

使用静态块上的System.setOut()将System.out重定向到PrintStream的实例。