2014-04-21 6 views
4

Cette question a été posée récemment lors d'une interview à laquelle j'ai participé.Modifier la sortie sans modifier le code

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

On m'a demandé de préserver à la fois la méthode signature principale (nom, nombre et type de paramètres, le type de retour) et la mise en œuvre (corps de la méthode),

et de faire de ce programme à la sortie de console standard message "Magic Output !"

J'ai pris environ 2 minutes pour répondre. Ma solution était d'y mettre un bloc statique et de sortir la chaîne requise.

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

Cela ne fonctionne pas mais, il imprime à la fois Magic Output ! et Hello, World!

Comment puis-je faire à la sortie que chaîne magique?

Répondre

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

ou plus drôle (dépend de la mise en œuvre String - fonctionne avec 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) { } 
} 
+0

Belle réponse dans peu de temps! Je veux voter 10 fois. – mok

+0

ahhh ... cool..Merci! Je t'aime – XTop

0

Redirect System.out à une instance de PrintStream en utilisant System.setOut() sur le bloc statique.

1

Vous pouvez également utiliser des classes imbriquées statiques pour y parvenir.

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