为什么在允许某些Unicode字符的注释中执行Java代码?

问题:

以下代码生成输出“Hello World!” (不,真的,尝试)。

public static void main(String... args) {

   // The comment below is not a typo.
   // \u000d System.out.println("Hello World!");
}

这样做的原因是Java编译器将Unicode字符\u000d解析为新行,并将其转换为:

public static void main(String... args) {

   // The comment below is not a typo.
   //
   System.out.println("Hello World!");
}

从而导致评论被“执行”。
由于这可以用来“隐藏”恶意代码或任何邪恶程序员可以设想的,为甚么可以在评论中
为什么Java规范允许这样做?

回答:

Unicode解码在任何其他词汇翻译之前进行。这样做的关键好处在于它使ASCII和其他编码之间来回移动变得轻而易举。你甚至不需要弄清楚什么意见开始和结束!
JLS Section 3.3所述,这允许任何基于ASCII的工具来处理源文件:

[…] Java编程语言规定了将使用Unicode编写的程序转换为ASCII的标准方法,将程序更改为可由基于ASCII的工具处理的表单。 […]

这为平台独立性(支持字符集的独立性)提供了基本保证,这一直是Java平台的关键目标。
能够在文件中的任何地方编写任何Unicode字符都是一个整洁的功能,在非拉丁语言记录代码时,在注释中尤其重要。事实上,它可以以这种微妙的方式干扰语义只是一个(不幸的)副作用。
这个主题有很多问题,Joshua Bloch和Neal Gafter的Java Puzzlers包含以下变体:

这是一个合法的Java程序吗?如果是这样,它打印什么?

(这个程序是一个简单的“Hello World”程序。)
在解决困惑者的解决方案中,他们指出以下几点:

更重要的是,这个难题有助于加强前三个课题:当您需要插入不能以任何其他方式表示为您的程序的字符时,Unicode转义是至关重要的。在所有其他情况下避免它们。

来源:Java: Executing code in comments?!

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Why is executing Java code in comments with certain Unicode characters allowed?

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

33 − 27 =