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.Formattersyntax- %[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");
 
         
                                         
                                         
                                         
                                        ![Interactive visualization of a graph in python [closed]](https://www.devze.com/res/2023/04-10/09/92d32fe8c0d22fb96bd6f6e8b7d1f457.gif) 
                                         
                                         
                                         
                                         加载中,请稍侯......
 加载中,请稍侯......
      
精彩评论