您的位置 首页 java

java不得不说的秘密-注释掉的代码被执行的秘密

什么,注销掉的代码被执行了。不可置信哇,来看代码:

 package org.test;

public class Test {
    public  static   void  main(String[] args) {
       String a = "我是初始化的的arn";
        //u000da+= "我是注释掉的arn";
        a += "我是修改后的的an";
        System.out.println(a);
    }
}  

废话不多说,上结果:

 我是初始化的的a
我是注释掉的a
我是修改后的的a  

有图有真相:

java不得不说的秘密-注释掉的代码被执行的秘密

为什么会如此呢,注释掉的信息怎么还可以执行呢?

其实在代码编译成 字节码 时,因 u000d 是换行的unicode表示,在编译成字节码时会认为是换行,导致注释的代码正确编译。
来看字节码:

  public static void main( java .lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=2, locals=2, args_size=1
         0: ldc           #2                  // String 我是初始化的的arn
         2: astore_1
         3: new           #3                  // class java/lang/StringBuilder
         6: dup
         7: invokespecial #4                  // Method java/lang/StringBuilder."<init>":()V
        10: aload_1
        11: invokevirtual #5                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/ StringBuilder ;
        14: ldc           #6                  // String 我是注释掉的arn
        16: invokevirtual #5                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
        19: invokevirtual #7                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
        22: astore_1
        23: new           #3                  // class java/lang/StringBuilder
        26: dup
        27: invokespecial #4                  // Method java/lang/StringBuilder."<init>":()V
        30: aload_1
        31: invokevirtual #5                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
        34: ldc           #8                  // String 我是修改后的的an
        36: invokevirtual #5                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
        39: invokevirtual #7                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
        42: astore_1
        43: getstatic     #9                  // Field java/lang/System.out:Ljava/io/PrintStream;
        46: aload_1
        47: invokevirtual #10                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
        50: return
      LineNumberTable:
        line 5: 0
        line 6: 3
        line 7: 23
        line 8: 43
        line 9: 50
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0      51     0  args   [Ljava/lang/String;
            3      48     1     a   Ljava/lang/String;
}
Source File : "Test.java"  

因此注释的时候,不可以带上 u000d
谨记!!!!

文章来源:智云一二三科技

文章标题:java不得不说的秘密-注释掉的代码被执行的秘密

文章地址:https://www.zhihuclub.com/199416.shtml

关于作者: 智云科技

热门文章

网站地图