成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

為什么給Java代碼加個空行,class文件就翻臉不認人了?

開發 后端
給Java源文件加個空行之后,它生成的字節碼,會有變化么?

 [[315266]]  

  1. public class HelloWorld {     
  2.     public static void main(String[] args) { 
  3.         System.out.println("love xjjdog"); 
  4.      } 

為了寫出這幾行優美的代碼,主要是為了讓它輸出優美動聽的樂符,我下了一番功夫。你不要覺得簡單,我把它打印出來給普通的保潔阿姨去看,阿姨竟然連xjjdog都認不出來。別說代碼了,中英文混血,就秒殺一大堆高干分子。

想說愛我就那么難么?怎么這么多的廢話呢?這次探討的主要問題是,給Java源文件加個空行之后,它生成的字節碼,會有變化么?

1、翻臉不認人

Java號稱一次編譯到處運行,大概就是class文件的功勞。不同的Java版本編譯之后的class文件那是肯定不一樣的,因為里面有一個版本號,那肯定影響了它們的內容。

我們就看一下,如果給上面的代碼,加一個空行,它的class文件會不會變。

這個空行還不能隨便加。它可能在xjjdog上面,也可能在下面。可能在{中,也可能在文件末尾。

1.1、打臉

在驗證之前,我們先看一下當前的class文件md5值。 

 

我非常喜歡被打臉,所以先看一種加空行也無所謂的情況。 

 

再次編譯之后看md5值,果然被打臉了。還好我已經練就了臉不紅心不跳的本領,這個結果厚著臉皮接受。 

 

1.2、抹藥

為了和主題遙相呼應,安慰一下受傷的心靈,我們把空行轉移到了這里。 

 

再次編譯之后,看md5值(怎么感覺這句話已經說過了呢)。

變了。這次真的變了。 

 

使用hexdump命令分析兩次生成的字節碼,發現其中只不過變了一個數字。 

 

2、騷戴斯乃

特別不喜歡分析這種二進制的東西。雖然CAFEBABE這個魔數在第一行歷歷在目。咖啡寶貝?怎么聽著像是某個番號?

我們還是用javap來看一下它的原型。

javap -p -v HelloWorld.class

通過對比兩次生成的字節碼,我們終于發現了這個變動,是一個叫做LineNumberTable的結構引起的。 

 

使用asmtools.jar深入分析這個結構,可以看到同樣的信息。 

 

LineNumberTable展示了Java源碼行號和字節碼指令的對應關系。前面的數字代表Java源代碼中的行號,而冒號后面的則代表字節碼里每行指令的映射關系。在對代碼進行調試的時候,能夠快速定位,順利進行。

也就是說,這些是輔助信息,我們可以在編譯的時候抹掉它。怎么抹掉呢?給javac一個參數就ok了。

javac -g:none HelloWorld.java

這樣編譯后的字節碼,緊湊、優雅、無用。不管你加多少空行,生成的字節碼都是一樣的。可是,我們再也不能暢快淋漓的進行調試了。

  1.   public HelloWorld(); 
  2.     descriptor: ()V 
  3.     flags: ACC_PUBLIC 
  4.     Code: 
  5.       stack=1, locals=1, args_size=1 
  6.          0: aload_0 
  7.          1: invokespecial #1                  // Method java/lang/Object."<init>":()V 
  8.          4: return 
  9.  
  10.   public static void main(java.lang.String[]); 
  11.     descriptor: ([Ljava/lang/String;)V 
  12.     flags: ACC_PUBLIC, ACC_STATIC 
  13.     Code: 
  14.       stack=2, locals=1, args_size=1 
  15.          0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream; 
  16.          3: ldc           #3                  // String Hello xjjdog 
  17.          5: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V 
  18.          8: return 

要想在開發階段讓字節碼又香又有用,可以直接使用參數-g開啟所有調試信息。IDEA可以在編譯選項里對這個參數進行開啟。有很多同學在編譯之后的代碼里找不到局部變量的符號表,也是由于這個參數沒有開啟所引起的。

 

 

責任編輯:武曉燕 來源: xjjdog
相關推薦

2020-02-19 11:16:40

Javaclass代碼

2024-02-05 22:48:32

系統代碼

2021-09-14 08:50:38

Kubernetes容器Docker

2019-04-09 10:45:18

IPv6運營商協議

2024-03-29 08:10:43

索引失效SQL

2017-02-27 15:19:04

2021-09-30 06:31:12

Spring Boot配置密碼

2018-04-02 10:58:28

大數據sqoop大數據項目

2018-04-11 09:50:04

大數據

2025-05-12 08:21:15

2020-04-17 19:41:57

基礎架構即代碼平臺即代碼云計算

2023-03-20 07:23:45

Docker開源存儲庫

2021-03-01 08:19:09

Java 包裝類對象

2021-08-26 11:10:42

架構運維技術

2024-11-19 18:03:04

2019-09-06 10:31:45

軟件開發地圖

2024-06-24 07:58:00

2023-07-23 17:19:34

人工智能系統

2020-06-10 09:06:48

MongoDB架構高可用

2021-08-10 23:09:55

區塊鏈數據技術
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 色眯眯视频在线观看 | 久久精品国产a三级三级三级 | 欧美淫片| 亚洲精品久久久一区二区三区 | 精品色 | 久久亚洲精品国产精品紫薇 | 午夜一区 | 久久中文字幕在线 | 精品国产乱码久久久久久久久 | 国产精品中文在线 | 91精品国产91久久久久久吃药 | 亚洲 自拍 另类 欧美 丝袜 | 国产精品黄色 | 免费天天干 | 视频一区二区在线观看 | 午夜丰满寂寞少妇精品 | 99久久免费精品国产免费高清 | 亚洲欧美少妇 | 看av电影| 亚洲成人av在线播放 | 一区二区免费在线观看 | 国产免费拔擦拔擦8x高清 | 永久www成人看片 | 日本黄视频在线观看 | 亚洲欧美视频在线观看 | 久久久久网站 | 成人av免费 | 91在线观看 | 五月激情婷婷六月 | 狠狠插天天干 | 欧美黄色一区 | 在线亚洲免费视频 | 欧美男人天堂 | 久久久久久国产一区二区三区 | 欧美精品在线免费 | 亚洲精品免费在线 | 免费一级黄色录像 | 区一区二区三在线观看 | 成人精品高清 | 国产目拍亚洲精品99久久精品 | 久久com |