注释可以在运行时产生任何影响吗?

Posted

技术标签:

【中文标题】注释可以在运行时产生任何影响吗?【英文标题】:Can comments make any difference during the run-time? 【发布时间】:2013-12-05 21:12:08 【问题描述】:

阅读What is the best comment我遇到this评论,点赞201次:

很久以前,我不小心通过添加一个 评论。它是 100% 可重现的;如果我删除了评论,它 坠毁。只要评论在那里,它就可以正常工作。我假设它 是一些奇怪的时间问题,但我从来没有弄清楚到底是什么 正在发生。

这可能吗?

如果他正在修复 Java3D 中的段错误,我猜他正在用 Java 或 C/C++ 编写代码。我认为在任何这些语言中,cmets 在编译之前都会被简单地擦除......

【问题讨论】:

这是不可能的,如果他插入评论的位置有一个特殊字符会发生什么,我以前也发生过这种情况,在 unix、windows 和 solaris 上工作相同的代码. 在 C 和 C++ 中,cmets 被预处理器删除:甚至在编译器看到代码之前。我见过 cmets 发出警告,例如:// does this work??? used to give an warning about an invalid trigraph. @RamonBoza 这个特殊角色很有趣(哪一个?) - 请您详细说明答案? 【参考方案1】:

不这么认为。为了运行Java程序,它应该被编译成字节码,这样在编译过程中cmets会被擦除,不会影响程序的执行。

【讨论】:

【参考方案2】:

我认为在任何这些语言中,cmets 都会被简单地擦除 编译前...

看起来可能是这样,但不幸的是,这个看起来无害Hello World 程序甚至无法编译。

为什么?因为一个评论。罪魁祸首是来源的路径。具体来说,\users。反斜杠\ 后跟字母u,表示Unicode 转义的开始。尾随的 sers 使其成为格式错误的 Unicode 转义。 (如果\u 后跟 4 个十六进制数字就可以了 - 是的,即使在评论中也需要。)

因此,代码甚至无法编译由于注释

public class HelloWorld 

    /**
     * Source: C:\users\devnull\HelloWorld.java
     */
    public static void main(String[] args) 
        System.out.println("Hello World!");
    

【讨论】:

【参考方案3】:

这里有两种解释。

一,记者错了。他们没有进行他们认为自己正在进行的编辑,或者编译或执行不正确,或者错误是不稳定的,并且与他们的编辑偶然相吻合,等等

第二,编辑删除了看起来像注释的内容,但它实际上与其他语法交互。例如,考虑:

/* Start comment.
…
/* Not a new comment. */
… Some code here …
/* Sometimes a comment. */

当出现“Not a new comment”行时,“Some code here”是不属于注释的源代码。当“Not a new comment”行不存在时,“Some code here”是注释的一部分。

【讨论】:

【参考方案4】:

正如您所说,Java cmets 不包含在编译的字节码中。例如,参加以下课程:

public class test 

    public void methodWithoutComment() 
        System.out.println("This method does not have a comment");
    

    public void methodWithComment() 
        // Method with comment
        System.out.println("This method has a comment");
    

如果我们使用javap 反省字节码,使用javap -c test,我们可以看到两种方法的字节码是相同的——除了输出到控制台的字符串:

public class test 
  public test();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public void methodWithoutComment();
    Code:
       0: getstatic     #2                  // Field     java/lang/System.out:Ljava/io/PrintStream;
       3: ldc           #3                  // String This method does not have a comment
       5: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
       8: return

  public void methodWithComment();
    Code:
       0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
       3: ldc           #5                  // String This method has a comment
       5: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
       8: return

【讨论】:

以上是关于注释可以在运行时产生任何影响吗?的主要内容,如果未能解决你的问题,请参考以下文章

我可以在同一台机器上运行两个 tomcat 实例吗?

在运行时获取列类型会影响 MySQL 性能吗?

Java计算md5时字段格式有影响吗?

缩小会影响 Node.js 的性能吗?

无法在运行时以编程方式影响闪烁控制

在运行时修改类定义的注释字符串参数