4

我在一次采访中被问到,当同一个程序正在执行时,如何将整个源程序显示为输出

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

对此有什么建议吗?

更新的解决方案: 当我研究了一些我得到了解决方案的东西时,我们可以由Quine来做

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

3 回答 3

1

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

请注意,空格字符的 ASCII 值是 32,双引号的 ASCII 值是 34。下面创建 'quote' 和 'sixSpaces' 的原因是为了在显示它们时避免使用转义字符 \,尝试显示报价时。

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
于 2013-10-26T05:44:23.723 回答
0

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

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

于 2013-10-26T05:21:27.243 回答
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);
    }
}

更新

根据巴西尔的评论,我很好奇。因此我找到了几个选择。检查此页面以获取 quine 页面中的示例程序

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

于 2013-10-26T05:27:11.463 回答