开发者

Is it possible to write a Java printf statement that prints the statement itself?

Is it possible to have a Java printf statement, whose output is the statement itself?

Some snippet to illustrate:

// attempt #1
public class Main {
public static void main(String[] args) {开发者_Python百科

System.out.printf("something");

}
}

This prints something.

So the output of attempt #1 is not quite exactly the printf statement in attempt #1. We can try something like this:

// attempt #2
public class Main {
public static void main(String[] args) {

System.out.printf("System.out.printf(\"something\");");

}
}

And now the output is System.out.printf("something");

So now the output of attempt #2 matches the statement in output #1, but we're back to the problem we had before, since we need the output of attempt #2 to match the statement in attempt #2.

So is it possible to write a one-line printf statement that prints itself?


It's not pretty, but this is certainly possible:

public class Main {
public static void main(String[] args) {

System.out.printf("System.out.printf(%c%s%1$c,34,%1$c%2$s%1$c);",34,"System.out.printf(%c%s%1$c,34,%1$c%2$s%1$c);");

}
}

The output (as run on ideone.com) is:

System.out.printf("System.out.printf(%c%s%1$c,34,%1$c%2$s%1$c);",34,"System.out.printf(%c%s%1$c,34,%1$c%2$s%1$c);");

This output matches the printf statement.

There are likely to be shorter solutions.

See also

  • java.util.Formatter syntax
    • %[argument_index$]conversion


System.out is a static PrintStream instance which may be replaced with any PrintStream by inovking System.out.setOut(PrintStream s). So, just write a subclass of PrintStream and override the necessary methods. The following is just a very simple example for demonstration. It's advisable to override more methods.

    public class VerbosePrintStream extends PrintStream{

        public VerbosePrintStream (PrintStream ps){
            super(ps, true);
        }

        @Override
        public void println(String x) {
            super.println("System.out.println(\""+x + "\");");
        }

    }

Now we test the above class:

VerbosePrintStream vps = new VerbosePrintStream(System.out);
    System.setOut(vps);
    System.out.println("test string");
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜