是否可以使用Java printf
语句,其输出是语句本身?
一些片段来说明:
// attempt #1
public class Main {
public static void main(String[] args) {
System.out.printf("something");
}
}
这会打印something
。
因此,尝试#1的输出并不完全是尝试#1中的printf
语句。我们可以尝试这样的事情:
// attempt #2
public class Main {
public static void main(String[] args) {
System.out.printf("System.out.printf(\"something\");");
}
}
现在输出为System.out.printf("something");
所以现在尝试#2的输出与输出#1中的语句匹配,但是我们回到了之前的问题,因为我们需要尝试#2的输出来匹配尝试#2中的语句。 / p>
那么可以编写一个打印自己的单行printf
语句吗?
答案 0 :(得分:6)
它不漂亮,但这肯定是可能的:
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);");
}
}
输出(as run on ideone.com)是:
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);");
此输出与printf
语句匹配。
可能会有更短的解决方案。
java.util.Formatter
syntax
%[argument_index$]conversion
答案 1 :(得分:2)
System.out是一个静态PrintStream实例,可以通过inovking System.out.setOut(PrintStream s)替换为任何PrintStream。 因此,只需编写PrintStream的子类并覆盖必要的方法。 以下只是一个非常简单的演示示例。建议覆盖更多方法。
public class VerbosePrintStream extends PrintStream{
public VerbosePrintStream (PrintStream ps){
super(ps, true);
}
@Override
public void println(String x) {
super.println("System.out.println(\""+x + "\");");
}
}
现在我们测试上面的类:
VerbosePrintStream vps = new VerbosePrintStream(System.out);
System.setOut(vps);
System.out.println("test string");