5

是否有可能有一个 Javaprintf语句,其输出是语句本身?

一些片段来说明:

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

System.out.printf("something");

}
}

这打印something

所以尝试 #1 的输出并不完全是printf尝试 #1 中的语句。我们可以尝试这样的事情:

// 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 中的语句。

那么是否可以编写一个打印自己的单行printf语句?

4

2 回答 2

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

}
}

输出(在 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语句匹配。

可能会有更短的解决方案。

也可以看看

于 2010-05-22T04:54:42.733 回答
2

System.out 是一个静态 PrintStream 实例,可以通过调用 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");
于 2010-05-22T07:41:38.063 回答