Java Class文件學習
class 文件結構
minor version:副版本
major version:主版本號
文件的版本號 major_version.minor_version
flags:訪問標誌
- ACC_PUBLICH 聲明為publich
- ACC_FINAL 聲明為final
- ACC_SUPER 當用到invokespecial指令時,需要對父類方法做特殊處理
- ACC_INTERFACE 該class文件定義的是介面而不是類
- ACC_ABSTRACT 聲明為abstract
- ACC_SYNTHETIC 聲明為synthetic
- ACC_ANNOTATION 標識註解類型
- ACC_ENUM 標識枚舉類型
constant pool 常量池
方法調用和返回指令
- invokevirtual 指令用於調用對象的實例方法,根據對象的實際類型進行分派
- invokeinterface 指令用於調用介面方法,它會在運行時搜索由特定對象實現的這個介面方法,並找出適合的方法進行調用
- invokespecial 指令用於調用一些需要特殊的實例方法,包括實例的初始化,私有方法和父類方法
- invokestatic 指令用於調用命名類中的靜態方法
- invokedynamic 指令用於調用可以綁定invokedynamic指令的調用點對象作為目標方法。
aaload_
aconst_null:將一個null值壓入到操作數棧頂
putfield:為制定類的欄位賦值
通過執行javac xxx.java javap -verbose xxx.class 查看class文件
public class AconstNullDemo {
Integer i=null;
void test{
i=1;
if(i.equals(Integer.valueOf(1))){
System.out.println("eq");
}
}
}
public class common.jvm.AconstNullDemo
minor version: 0
major version: 52
flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
#1 = Methodref #9.#20 // java/lang/Object."
#2 = Fieldref #8.#21 // common/jvm/AconstNullDemo.i:Ljava/lang/Integer;
#3 = Methodref #22.#23 // java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
#4 = Methodref #22.#24 // java/lang/Integer.equals:(Ljava/lang/Object;)Z
#5 = Fieldref #25.#26 // java/lang/System.out:Ljava/io/PrintStream;
#6 = String #27 // eq
#7 = Methodref #28.#29 // java/io/PrintStream.println:(Ljava/lang/String;)V
#8 = Class #30 // common/jvm/AconstNullDemo
#9 = Class #31 // java/lang/Object
#10 = Utf8 i
#11 = Utf8 Ljava/lang/Integer;
#12 = Utf8
#13 = Utf8 V
#14 = Utf8 Code
#15 = Utf8 LineNumberTable
#16 = Utf8 test
#17 = Utf8 StackMapTable
#18 = Utf8 SourceFile
#19 = Utf8 AconstNullDemo.java
#20 = NameAndType #12:#13 // "
#21 = NameAndType #10:#11 // i:Ljava/lang/Integer;
#22 = Class #32 // java/lang/Integer
#23 = NameAndType #33:#34 // valueOf:(I)Ljava/lang/Integer;
#24 = NameAndType #35:#36 // equals:(Ljava/lang/Object;)Z
#25 = Class #37 // java/lang/System
#26 = NameAndType #38:#39 // out:Ljava/io/PrintStream;
#27 = Utf8 eq
#28 = Class #40 // java/io/PrintStream
#29 = NameAndType #41:#42 // println:(Ljava/lang/String;)V
#30 = Utf8 common/jvm/AconstNullDemo
#31 = Utf8 java/lang/Object
#32 = Utf8 java/lang/Integer
#33 = Utf8 valueOf
#34 = Utf8 (I)Ljava/lang/Integer;
#35 = Utf8 equals
#36 = Utf8 (Ljava/lang/Object;)Z
#37 = Utf8 java/lang/System
#38 = Utf8 out
#39 = Utf8 Ljava/io/PrintStream;
#40 = Utf8 java/io/PrintStream
#41 = Utf8 println
#42 = Utf8 (Ljava/lang/String;)V
{
java.lang.Integer i;
descriptor: Ljava/lang/Integer;
flags:
public common.jvm.AconstNullDemo;
descriptor: V
flags: ACC_PUBLIC
Code:
stack=2, locals=1, args_size=1
0: aload_0
1: invokespecial #1 // Method java/lang/Object."
4: aload_0
//將null壓入棧頂
5: aconst_null
//將null賦值給屬性i
6: putfield #2 // Field i:Ljava/lang/Integer;
9: return
LineNumberTable:
line 6: 0
line 7: 4
void test;
descriptor: V
flags:
Code:
stack=2, locals=1, args_size=1
//載入this到操作棧
0: aload_0
//載入常量1到操作棧
1: iconst_1
//調用靜態方法
2: invokestatic #3 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
//將計算結果賦值給屬性,為什麼putfield的索引不是連續的?這是因為invokestatic操作和操作數長度為3個slot
5: putfield #2 // Field i:Ljava/lang/Integer;
//載入this到操作棧
8: aload_0
//將屬性壓入棧頂
9: getfield #2 // Field i:Ljava/lang/Integer;
//載入常量1到操作棧頂
12: iconst_1
//調用靜態方法Integer.valueOf
13: invokestatic #3 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
//調用虛方法equals
16: invokevirtual #4 // Method java/lang/Integer.equals:(Ljava/lang/Object;)Z
//如果ifeq的結果為0則挑戰到30行
19: ifeq 30
22: getstatic #5 // Field java/lang/System.out:Ljava/io/PrintStream;
25: ldc #6 // String eq
27: invokevirtual #7 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
30: return
LineNumberTable:
line 10: 0
line 11: 8
line 12: 22
line 14: 30
StackMapTable: number_of_entries = 1
frame_type = 30 /* same */
}
※一種解決HTTP抓取網頁超時設置無效的方法
※Java集合-ArrayList
※懵懂oracle之存儲過程2
※Step by Step 用Azure Automation 來開虛機(ARM)
※easygen通用代碼生成框架
TAG:科技優家 |
※Web Pages 文件
※讀取ClassPath下resource文件的正確姿勢
※Project Parfait將Photoshop文件轉換為代碼
※Pure Storage收購瑞典文件管理軟體公司Cpmpuverde
※Avante Technology發布Emendo Cloud 3D列印文件自動分析和維修服務
※使用Elasticsearch搭建一個文件搜索系統
※理解 Linux 中的 /etc/services 文件
※Linux系統安裝Oracle,配置etc/security/limits.conf文件
※Eclipse編輯Spring配置文件xml時自動提示類class包名
※使用 YAML 文件創建 Kubernetes Deployment
※不打開文件獲取名稱。Excel VBA Application對象GetOpenFilename方法教程
※乾貨:詳解 Tomcat 配置文件 server.xml
※Spring Boot 配置文件 yml與properties
※Spring Boot學習筆記系列之Spring Boot配置文件屬性值校驗
※tempfile.NamedTemporaryFile創建臨時文件在windows沒有許可權打開
※WordPress插件WooCommerce任意文件刪除漏洞分析
※MyBatis中Dao層、Service層以及xml文件的CRUD模板
※使用python將excel轉為lua文件
※linux中用locate查找文件
※iMessage漏洞致iPhone上任意文件讀取