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");
精彩评论