1. 程式人生 > >Java:如何用Eclipse檢視Class位元組碼指令集程式碼

Java:如何用Eclipse檢視Class位元組碼指令集程式碼

轉:https://zhidao.baidu.com/question/368994445436401884.html

在遇到一些小問題的時候我們經常會使用Javap反編譯取得位元組碼來分析,雖然Javap能完成這個工作,但是有兩個缺點,一方面操作麻煩,需要很多步驟,一方面沒有文件註釋,對新手來說看起位元組碼來比較麻煩。 
這裡推薦一個工具,Bytecode Outline .它是Eclipse的外掛,可以把當前的正在編輯Java的檔案或者class檔案直接顯示出其相應的位元組碼出來,而且可以進行兩個Java檔案的位元組碼比較或者兩個class檔案的位元組碼比較或一個Java檔案與一個class檔案進行位元組碼的比較。 


安裝方法:和其它外掛類似,可以拷貝到plugin下也可以link方式安裝 
下載地址:http://forge.objectweb.org/projects/asm/
注意:因為Bytecode Outline的執行需要ASM Framework,所以也要下載這個檔案 
對應的兩個檔名為: 
org.objectweb.asm_2.2.2.jar 
de.loskutov.BytecodeOutline_2.1.0.jar 
也可以用update的方式來安裝,好處是可以隨時更新,地址如下: 
http://download.forge.objectweb.org/eclipse-update/
試了一下,不知道什麼原因,第一種方法失敗,只有使用第二種方法了,不過也很方便,在eclipse下安裝.點選help->software update->find and install... 後面的就按一步步安裝就可以了. 


安裝完了,windows-->showview-->other-->點開Java的樹-->選擇Bytecode ,同樣的方法選擇Bytecode Reference .下面看一個典型的String的反編譯例子: 
public static void main(String[] args){ 
String m="mango"; 
String s="abc"+m+"def"+47; 
System.out.println(s); 

反編譯後: 
// access flags 9 
public static main(String[]) : void 
L0 (0) 
LINENUMBER 6 L0 

LDC "mango" 
ASTORE 1: m 
L1 (3) 
LINENUMBER 7 L1 
NEW StringBuilder 
DUP 
LDC "abc" 
INVOKESPECIAL StringBuilder.<init>(String) : void 
ALOAD 1: m 
INVOKEVIRTUAL StringBuilder.append(String) : StringBuilder 
LDC "def" 
INVOKEVIRTUAL StringBuilder.append(String) : StringBuilder 
BIPUSH 47 
INVOKEVIRTUAL StringBuilder.append(int) : StringBuilder 
INVOKEVIRTUAL StringBuilder.toString() : String 
ASTORE 2: s 
L2 (16) 
LINENUMBER 8 L2 
GETSTATIC System.out : PrintStream 
ALOAD 2: s 
INVOKEVIRTUAL PrintStream.println(String) : void 
L3 (20) 
LINENUMBER 9 L3 
RETURN 
L4 (22) 
LOCALVARIABLE args String[] L0 L4 0 
LOCALVARIABLE m String L1 L4 1 
LOCALVARIABLE s String L2 L4 2 
MAXSTACK = 3 
MAXLOCALS = 3 

通過反編譯後的位元組碼,我們就會更加深刻理解String中的"+"操作過程了. 
相信有了它,對以後的學習一定會有很大的幫助~

相關推薦

Java如何用Eclipse檢視Class位元組指令程式碼

轉:https://zhidao.baidu.com/question/368994445436401884.html 在遇到一些小問題的時候我們經常會使用Javap反編譯取得位元組碼來分析,雖然Javap能完成這個工作,但是有兩個缺點,一方面操作麻煩,需要很多步驟,一方

JVM九class位元組指令

一:位元組碼與資料型別     Java虛擬機器的指令由一個位元組長度,代表著某種特定操作含義的數字(稱為操作碼)以及跟其隨後的零至多個代表此操作所需引數(稱為運算元)而構成。Java虛擬機器採用面向運算元棧而不是暫存器的架構,所以大多數指令都不包含運算元。因為位元

深入理解java虛擬機器(六)位元組指令簡介

Java虛擬機器指令是由(佔用一個位元組長度、代表某種特定操作含義的數字)操作碼Opcode,以及跟隨在其後的零至多個代表此操作所需引數的稱為運算元 Operands 構成的。由於Java虛擬機器是面向運算元棧而不是暫存器的架構,所以大多數指令都只有操作碼,而沒有運算元。 位元組碼指令集是一種具有鮮明特點、

[四] java虛擬機器JVM編譯器編譯程式碼簡介 位元組指令例項 程式碼到底編譯成了什麼形式

public static void main(String[] args) { boolean bNum = true; char cNum = 2; byte byteNum = 127; short sNum = 32767; int iNum = 100; long lNum =

[三] java虛擬機器 JVM位元組 指令 bytecode 操作 指令分類用法 助記符

上面關於dup的描述摘自 虛擬機器規範,很難理解看起來是非常難以理解的,不妨換一個角度我們知道區域性變數的空間分配分為兩種long 和 double 佔用2個slot  其他佔用一個運算元棧,每個單位可以表示虛擬機器支援的任何的一個數據型別不過運算元棧其實同區域性變數一樣,他也是被組織一個數組, 每個元素的資

jvm探祕六位元組指令

概述 java虛擬機器的指令有一個位元組長度的,代表某種特定的操作含義的數字(操作碼)以及跟隨其後的零至多個代表此操作所需引數(運算元)構成。 由於java虛擬機器採用面向運算元棧而不是暫存器的架構,大多數指令都不含運算元,只有一個操作碼。Java虛擬機

Java位元組指令的使用詳細

jdk 自帶反編譯工具 javap 指令:javap -c -verbose MyClass Java虛擬機器指令由一個位元組長度的、代表某種特定含義的操作碼(Opcode)以及其後的零個至多個代表此操作引數的運算元構成。虛擬機器中許多指令並不包含運算元,只有一個操作碼。若

JVM學習筆記1:位元組指令

一.位元組碼指令集簡介: Java虛擬機器的指令由一個位元組長度的、代表著某種特定操作含義的操作碼(opcode)以及跟隨其後的零至多個代表此操作所需引數的運算元(operand)所構成。虛擬機器中許多指令並不包含運算元,只有一個操作碼。 如果忽略異常處理,那麼java虛

Python 2.6.2的位元組指令一覽

對Python的位元組碼指令集感興趣但不知道從何下手麼?執行這段程式碼就能看到位元組碼的列表:  Python程式碼   import opcode   for op in range(len(opcode.opname)):     print('0x%.2X(%

jvm位元組指令

有時候為了能理解JVM對程式所做的優化等,需要檢視程式的位元組碼,因此知道了解一些常見的指令集很重要! 指令碼 助記符 說明 0x00 nop 什麼都不做 0x01 aconst_null 將null推送至棧頂

JVM位元組指令簡介

Java 虛擬機器的指令由一個位元組長度的、代表著某種特定操作含義的操作碼(Opcode)以及跟隨其後的零至多個代表此操作所需引數的運算元(Operands)所構成。虛擬機器中許多指令並不包含運算元,只有一個操作碼。 如果忽略異常處理,那 Java 虛擬機器的直譯器使用下

Java虛擬機器(四)Class檔案結構及位元組指令

    接下來的兩個位元組為this_class項,它是一個對常量池的索引。在this_class位置的常量池入口必須為CONSTANT_Class_info表。該表由兩個部分組成——標籤和name_index。標籤部分是一個具有CONSTANT_Class值的常量,在name_index位置的常量池入口為一

JavaLambda表達式簡化代一例

得到 ror cep ring false stat bst mex log   之前,調用第3方服務,每個方法都差不多“長”這樣, 寫起來啰嗦, 改起來麻煩, 還容易改漏。 public void authorizeRoleToUser(Lo

大話+圖說Java位元組指令——只為讓你懂

前言 隨著Java開發技術不斷被推到新的高度,對於Java程式設計師來講越來越需要具備對更深入的基礎性技術的理解,比如Java位元組碼指令。不然,可能很難深入理解一些時下的新框架、新技術,盲目一味追新也會越來越感乏力。 本文既不求照本宣科,亦不求炫技或著文立說,僅力圖以最簡明、最形象生動的方式,結合例子與

C語言開發檢視HEX位元組的工具--看程式如何進化

昨日所作的檢視HEX位元組碼程式,雖然不完善,但程式碼量的確很小。其中核心程式碼不過十行上下,其餘還都是例行公事,如開啟檔案,檢查輸入命令並跳轉執行的。 現在,我再增加數行程式碼,使之在介面和功能上接近UltraEdit或Notepad++的顯示,甚至更強!對於

java檔案轉化為class位元組檔案

一.基本原理   二.實現過程 1.在桌面上編寫.java檔案 public class calculator { public static void main(String[] args) { int num1 = 7; int num2 = 5;

檢視任何檔案的二進位制--這有何難?C開發檢視HEX位元組的工具,兼論命令列程式開發方法

目的-用C開發檢視HEX位元組碼的工具 在windows下,要看一個文字檔案的內容,可用”記事本“即可,用type file.txt 也可在命令窗顯示檔案內容。但是– 如果要看一個二進位制檔案的內部位元組碼,用什麼工具? 你會說,有很多工具呢!例如HexView

Java虛擬機器學習方法呼叫的位元組指令

我們在寫java程式的時候會進行各種方法呼叫,虛擬機器在執行這些呼叫的時候會用到不同的位元組碼指令,共有如下五種: 1. invokespecial:呼叫私有例項方法; 2. invokestatic:呼叫靜態方法; 3. invokevirtual:呼叫

Java二進制(原、反、補碼)與位運算

無符號 位與 轉換成 轉換 不同 一個 位或 其他 log 一、二進制(原碼、反碼、補碼) 二進制的最高位是符號位(“0”代表正數,“1”代表負數); Java中沒有無符號數; 計算機以整數的補碼進行運算; 1. 原碼:將一個整數轉換成二進制表示 以 int 類型為例

Java鍵盤輸入個人信息並輸出

新手練習package 課堂練習;// 包的申明import java.util.*; //導入Java.util的所有類/** Created by Administrator on 2018/4/17 0017.*/ /鍵盤輸入個人簡歷並輸出 2018.4.17 V.1*/public cla