2014-04-21 2 views
4

이 질문은 최근에 내가 참석 한 인터뷰에서 요청되었습니다.코드 수정없이 출력 변경

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!

어떻게 내가 그것을 출력 전용 마법 문자열로 만들 수 있습니까?

답변

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

또는 웃긴다는 (문자열 구현에 따라 달라집니다 - 오픈 JDK 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) { } 
} 
+0

짧은 시간에 멋진 답변입니다! 나는 10 번 투표를하고 싶다. – mok

+0

아 ... 멋지다. 고마워! 당신을 사랑합니다 – XTop

0

리디렉션은 System.out을 정적 블록에 System.setOut()를 사용하여의 PrintStream의 인스턴스.

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 !"); 
     } 
    } 
}