5

printf出力がステートメント自体である Java ステートメントを使用することは可能ですか?

説明するためのいくつかのスニペット:

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

System.out.printf("something");

}
}

これは印刷されsomethingます。

printfしたがって、試行 #1 の出力は、試行 #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では、自分自身を出力する 1 行のステートメントを書くことは可能でしょうか?

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) を inovking することで任意の 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 に答える