执行时显示源程序作为输出?

时间:2013-10-26 05:17:11

标签: java

我在接受采访时被问及 如何在同一个程序执行时将整个源程序显示为输出

  • 通常我们使用File-handling概念,是否有其他方法可以实现此任务

对此有何建议?

更新解决方案    当我研究了一些解决方案时,我们可以通过Quine

来完成
  • 它执行代码并打印源程序,但我们需要将整个程序作为输入String array ...作为@Basile在下面评论

3 个答案:

答案 0 :(得分:1)

这是一个程序,运行时会显示自己。秘诀是创建一个包含程序行的字符串数组,除了数组本身的字符串。所以你有一个第一个循环来显示行在Strings之前的代码。然后你有一个循环来显示数组字符串,然后你有一个循环来显示代表剩余代码行的数组字符串。

请注意,空格字符的ASCII值为32,双引号的ASCII值为34.下面创建“quote”和“sixSpaces”的原因是为了避免使用转义char \,whentrying显示引号。

public class ProgramThatDisplaysItself {

public static void main(String[] args) {
char space = (char)32;
char quote = (char)34;
String emptyStr = new String();
String spaceStr = String.valueOf(space);
String sixSpaces =
  emptyStr.concat(spaceStr).concat(spaceStr).concat(spaceStr)
          .concat(spaceStr).concat(spaceStr).concat(spaceStr);

String linesOfCode[] = {
  "package programthatdisplaysitself;",
  "",
  "public class ProgramThatDisplaysItself {",
  "",
  "  public static void main(String[] args) {",
  "    char space = (char)32;",
  "    char quote = (char)34;",
  "    String emptyStr = new String();",
  "    String spaceStr = String.valueOf(space);",
  "    String sixSpaces = ",
  "      emptyStr.concat(spaceStr).concat(spaceStr).concat(spaceStr)",
  "              .concat(spaceStr).concat(spaceStr).concat(spaceStr);",
  "",
  "    String linesOfCode[] = {",
  // Note: here's where the String array itself is skipped
  "    };",
  "",
  "    for ( int i = 0; i < 14; i++ ) {",
  "      System.out.println( linesOfCode[i] );",
  "    } // end for i",
  "",
  "    for ( int j = 0; j < linesOfCode.length; j++ ) {",
  "      System.out.println( sixSpaces + quote + linesOfCode[j] + quote + ',' );",
  "    } // end for j",
  "",
  "    for ( int k = 14; k < linesOfCode.length; k++ ) {",
  "      System.out.println( linesOfCode[k] );",
  "    } // end for k",
  "",
  "  } // end main()",
  "",
  "} // end class ProgramThatDisplaysItself",
}; // end linesOfCode[]
//display the lines until the String array elements
for ( int i = 0; i < 14; i++ ) {
  System.out.println( linesOfCode[i] );
} // end for i

//display the String array elements
for ( int j = 0; j < linesOfCode.length; j++ ) {
  System.out.println( sixSpaces + quote + linesOfCode[j] + quote + ',' );
} // end for j

//display the lines after the String array elements
for ( int k = 14; k < linesOfCode.length; k++ ) {
  System.out.println( linesOfCode[k] );
} // end for k

} // end main()

} // end class ProgramThatDisplaysItself

答案 1 :(得分:0)

一旦它在字节码中,我认为你不能从中获取源代码。 我能看到实现这一目标的唯一方法是程序是否保存了代码的字符串副本,或者从用于编译和打印出来的文件加载相同的源代码。

编辑:检查Quine计算机后,示例是在程序中使用一个字符串,其中包含代码的副本。

答案 2 :(得分:0)

您可以像这样编码来打印源代码。这是你在找什么?

class A{
    public static void main(String args[]) throws Exception {
        FileReader f = new FileReader(filePathOfThisClass);
        BufferedReader b = new BufferedReader(f);
        String s= null;
        while ((str = b.readLine()) != null)
            System.out.println(s);
    }
}

<强>更新

根据Basile的评论,我很好奇。因此我找到了几个选择。从quine页面查看此页面以获取示例程序

http://www.nyx.net/~gthompso/self_java.txt