我在一次采访中被问到,当同一个程序正在执行时,如何将整个源程序显示为输出
- 通常我们
File-handling
为此使用概念,是否有其他方法可以完成此任务
对此有什么建议吗?
更新的解决方案: 当我研究了一些我得到了解决方案的东西时,我们可以由Quine来做
- 它执行代码并打印源程序,但我们需要将整个程序作为输入
String array
..正如@Basile 在下面评论的
这是一个在运行时会显示自己的程序。秘诀是创建一个包含程序行的字符串数组,除了数组本身中的字符串。所以你有一个第一个循环来显示数组之前的代码行字符串。然后你有一个循环来显示数组字符串,然后你有一个循环来显示代表剩余代码行的数组字符串。
请注意,空格字符的 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
一旦它在字节码中,我认为您无法从中获取源代码。我能看到实现这一点的唯一方法是,如果程序保存了它的代码的字符串副本,或者从用于编译和打印它的文件中加载相同的源代码。
编辑:检查 Quine 计算机后,示例是在程序中使用一个字符串,其中是代码的副本。
您可以像这样编写代码来打印源代码。是你要找的吗?
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 页面中的示例程序