📜  Java中的可执行注释

📅  最后修改于: 2022-05-13 01:54:54.645000             🧑  作者: Mango

Java中的可执行注释

注释是不被编译器或解释器执行的语句,而是在编译器中对程序进行词法转换之前,将程序的内容编码成ASCII,以便于处理。考虑这个程序:

class Main{
  
    public static void main(String[] args) {
        // The comment below is magic..
        // \u000d System.out.println("Geek Comment Executed!");
    }
}

此代码将被成功执行和编译以产生输出。
输出

Geek Comment Executed!

这成功地产生了这个输出,因为在词法转换之前的Java编译器将 Unicode字符\u000d 解析为一个新行并且程序被转换为:

class Main{
      
    public static void main(String[] args) {
        // The comment below is magic
        //
        System.out.println("Geek Comment Executed!");
    }
}

Unicode字符将 print 语句转移到下一行,然后像普通的Java程序一样执行。那么问题来了,为什么 Unicode 转义的翻译发生在任何其他源代码处理之前?

1. Java源代码可以用任何允许字符串、字面量和注释中的各种字符的编码编写。
1.它使基于ASCII的工具的处理更容易。
2.这保证了Java平台依赖性,即独立于支持的字符集。
3. 这有助于用非拉丁语言记录代码。

能够在文件的任何位置写入任何 Unicode字符是一个很好的功能,它可以以如此微妙的方式干扰语义的事实只是一个副作用。

让我们考虑这个Java程序:

\u0070\u0075\u0062\u006c\u0069\u0063\u0020\u0020\u0020\u0020
\u0063\u006c\u0061\u0073\u0073\u0020\u0055\u0067\u006c\u0079
\u007b\u0070\u0075\u0062\u006c\u0069\u0063\u0020\u0020\u0020
\u0020\u0020\u0020\u0020\u0073\u0074\u0061\u0074\u0069\u0063
\u0076\u006f\u0069\u0064\u0020\u006d\u0061\u0069\u006e\u0028
\u0053\u0074\u0072\u0069\u006e\u0067\u005b\u005d\u0020\u0020
\u0020\u0020\u0020\u0020\u0061\u0072\u0067\u0073\u0029\u007b
\u0053\u0079\u0073\u0074\u0065\u006d\u002e\u006f\u0075\u0074
\u002e\u0070\u0072\u0069\u006e\u0074\u006c\u006e\u0028\u0020
\u0022\u0048\u0065\u006c\u006c\u006f\u0020\u0077\u0022\u002b
\u0022\u006f\u0072\u006c\u0064\u0022\u0029\u003b\u007d\u007d

输出:

Hello World

将此 unicode 程序转换为其代表值以生成“Hello World”
参考——
https://stackoverflow.com/questions/30727515/why-is-executing-java-code-in-comments-with-certain-unicode-characters-allowed?newsletter=1&nlcode=222379%7C1266