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

Java編譯和反編譯那些事

開發 后端
我們可以通過javac命令將Java程序的源代碼編譯成Java字節碼,即我們常說的class文件,這是我們通常意義上理解的編譯。

[[385761]]

前言

挺久沒更文章了,之前有一個月在面試,后來寫了篇面經,有一些朋友找我交流問題,所以一直沒時間寫技術文章,估計以后更新文章頻率不會那么高了,不過還是會定期分享的,我的目的還是希望我的每篇文章大家都能學到點東西

基本概念

我們可以通過javac命令將Java程序的源代碼編譯成Java字節碼,即我們常說的class文件,這是我們通常意義上理解的編譯

但是,字節碼并不是機器語言,要想讓機器能夠執行,還需要把字節碼翻譯成機器指令,這個過程是通過解釋器實現的,叫解釋執行

注意:大家別把編譯和解釋執行混淆了,而后面所說的后端編譯過程是JVM為提高效率做的優化

在不同的虛擬機實現中,執行引擎在執行字節碼的時候,通常會有解釋執行(通過解釋器執行)和編譯執行(通過即時編譯器產生本地代碼執行)兩種選擇,也可能兩者兼備

所以大家可以思考下,Java到底是屬于編譯型語言還是解釋器語言呢

那為什么java不直接編譯成可執行文件呢

為了實現跨平臺

Java源碼通過編譯成字節碼,然后通過不同平臺的虛擬機解釋執行,從而實現 一次編譯,到處運行的跨平臺的效果

編譯原理

Java語言的編譯期分為前端編譯和后端編譯兩個階段

前端編譯

前端編譯是指把*.java文件轉變成*.class文件的過程

包括詞法分析、語法分析、語義分析與中間代碼生成

主要有下面幾個步驟:

后端編譯

在部分商用虛擬機中,Java程序最初是通過解釋器進行解釋執行的,當虛擬機發現某個方法或代碼塊的運行特別頻繁時,就會把這些代碼認定為熱點代碼

為了提高熱點代碼的執行效率,在運行時, 虛擬機將會把這些代碼編譯成與本地平臺相關的機器碼

完成這個任務的后端編譯器稱為即時編譯器(JIT編譯器)

反編譯

什么是反編譯

既然Java 編譯是指將 Java 源碼編譯成 Java 字節碼的過程

那么Java 反編譯簡單說就是指根據 Java 字節碼翻譯成源碼的過程

為什么要有反編譯

首先這個源碼是字符編碼,字節碼是二進制字節流,并且源碼是給人看的,字節碼是給虛擬機看的

因此如果想給人看,需要將字節碼轉為源碼。如果想給虛擬機執行,需要將源碼編譯成字節碼,當我們有類文件想看源碼時,可以采用反編譯的方式實現

比如想了解某個 Java 語法糖編譯后,再反編譯是什么樣的;別人給你發一個 jar 包,你需要看其中某個類是怎么寫的,等此類情況都可以考慮是用 Java 反編譯

反編譯工具

在線反編譯工具

1.http://www.decompiler.com/

2.http://www.javadecompilers.com/,該網站的主要優勢在于有多種反編譯器可供選擇

離線反編譯工具

JD-GUI

GitHub :https://github.com/java-decompiler/jd-gui

官網:http://java-decompiler.github.io/

下載后將類文件或者 jar 包直接拖動到界面即可

  1. Luyten 

下載地址:https://github.com/deathmarine/Luyten/releases

  1. Arthas 

官網:https://arthas.aliyun.com/doc/

可以使用 jad 命令將 JVM 中運行的 class 的 byte code 反編譯成 java 代碼

這個工具很好用,強烈推薦

其他工具

javap

javap是jdk自帶的一個工具,可以對代碼反編譯,也可以查看java編譯器生成的字節碼

直接通過javap -help查看其用法

  1. 用法: javap <options> <classes> 
  2. 其中, 可能的選項包括: 
  3.   -help  --help  -?        輸出此用法消息 
  4.   -version                 版本信息 
  5.   -v  -verbose             輸出附加信息 
  6.   -l                       輸出行號和本地變量表 
  7.   -public                  僅顯示公共類和成員 
  8.   -protected               顯示受保護的/公共類和成員 
  9.   -package                 顯示程序包/受保護的/公共類 
  10.                            和成員 (默認) 
  11.   -p  -private             顯示所有類和成員 
  12.   -c                       對代碼進行反匯編 
  13.   -s                       輸出內部類型簽名 
  14.   -sysinfo                 顯示正在處理的類的 
  15.                            系統信息 (路徑, 大小, 日期, MD5 散列) 
  16.   -constants               顯示最終常量 
  17.   -classpath <path>        指定查找用戶類文件的位置 
  18.   -cp <path>               指定查找用戶類文件的位置 
  19.   -bootclasspath <path>    覆蓋引導類文件的位置 

基本使用:

  1. javac Test.java 
  2. javap -c Test.class 

jclasslib

jclasslib 是一種可視化的字節碼查看工具,可以直接在 IDEA 插件安裝

安裝以后,在 IDEA 編譯源碼后,可以選擇 View” ->“Show Bytecode With Jclasslib即可查看字節碼

可以直觀地看到 class 文件包含基本信息、常量池、接口信息、字段信息、方法信息和屬性信息

其中方法信息又包含行號表、局部變量表,異常表等

要讀懂字節碼指令涉及的知識很多,之后的文章會通過案例詳細講解class文件結構和字節碼指令的執行過程

推薦兩本非常經典的圖書:《深入理解 Java 虛擬機》、《Java 虛擬機規范》

反編譯示例

下面看一個簡單和常見的案例:

  1. public class ForEachDemo { 
  2.     public static void main(String[] args) { 
  3.  
  4.         List<String> data = new ArrayList<>(); 
  5.         data.add("a"); 
  6.         data.add("b"); 
  7.  
  8.         for (String str : data) { 
  9.             System.out.println(str); 
  10.         } 
  11.  
  12.     } 

我們直接在 IDEA 對該類文件進行編譯,然后再 target 目錄中尋找該類,雙擊打開,得到下面的反編譯源碼:

  1. public class ForEachDemo { 
  2.     public ForEachDemo() { 
  3.     } 
  4.  
  5.     public static void main(String[] args) { 
  6.         List<String> data = new ArrayList(); 
  7.         data.add("a"); 
  8.         data.add("b"); 
  9.         Iterator var2 = data.iterator(); 
  10.  
  11.         while(var2.hasNext()) { 
  12.             String str = (String)var2.next(); 
  13.             System.out.println(str); 
  14.         } 
  15.  
  16.     } 

從上述反編譯代碼可以清楚地看到,原始代碼中沒有編寫構造方法時,編譯器會自動生成一個默認構造方法;foreach 循環來遍歷 list 時,底層通過 iterator 來實現

本文轉載自微信公眾號「月伴飛魚」,可以通過以下二維碼關注。轉載本文請聯系月伴飛魚公眾號。

 

責任編輯:武曉燕 來源: 月伴飛魚
相關推薦

2015-01-15 11:01:43

2017-02-20 13:54:14

Java代碼編譯

2011-05-31 14:52:13

Android 反編譯 方法

2020-03-17 16:15:01

Python編譯代碼

2011-04-20 10:32:44

java反編譯

2009-06-11 14:11:33

代碼混淆Java反編譯

2012-11-06 10:02:04

JavaJadEclipse

2011-05-31 14:38:04

Android 反編譯

2014-09-25 10:28:02

反編譯工具Java

2009-06-11 13:49:30

2015-01-15 10:15:16

Android反編譯-smail語法

2025-06-23 08:25:00

SFINAEC++編譯器

2011-05-31 14:18:17

2015-07-13 15:52:18

反編譯Android APK

2021-12-10 10:05:27

Java反編譯jar

2020-10-07 22:21:13

程序員技術線程

2015-05-28 14:02:09

JavaJava日志性

2011-12-02 10:32:23

Java

2021-05-18 10:18:15

Java

2017-11-27 15:43:49

Androidjadx反編譯
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日本天天操| 欧美国产视频 | 亚洲一级毛片 | 一区二区在线看 | 欧美色偷拍 | 午夜在线 | 超碰日本 | 三级黄视频在线观看 | 成人h视频 | 国产精品毛片在线 | 日韩欧美亚洲综合 | 亚洲第一视频网 | 色爱综合网 | 狠狠操av| 亚洲视频免费在线观看 | 国产精品久久久久久久久污网站 | 日日天天| 国产精品18hdxxxⅹ在线 | 台湾佬伊人 | 九九热在线观看视频 | 午夜综合 | 狠狠狠干 | 欧美在线小视频 | 成人av网站在线观看 | 免费色网址 | 春色av| 日韩欧美在线观看 | 久久久免费电影 | 日韩一级电影免费观看 | 91精品国产综合久久精品图片 | 国产成人精品久久二区二区91 | 午夜色播 | 国产极品粉嫩美女呻吟在线看人 | 国产亚洲精品精品国产亚洲综合 | 99精品视频在线观看免费播放 | 亚洲精品视频在线看 | 日韩一区二区在线视频 | 欧美a区| 国产精品久久久久久久久久久免费看 | 久久久久国产一区二区三区 | 亚洲综合三区 |