Java字节码技术
什么是字節(jié)碼
Java bytecode是由單個(byte)組成,理論上最多支持256個操作碼(opcode)。實際上Java只用了200多個左右的操作碼,還有一些操作碼留給調(diào)試操作。
根據(jù)操作碼的性質(zhì)主要分為四大類
生成字節(jié)碼
寫一個最簡單的類源碼如下
package demo.jvm0104;public class HelloByteCode{public static void main(String[] args){HelloByteCode obj=new HelloByteCode();} }
編譯:javac demo/jvm0104/HelloByteCode.java
查看字節(jié)碼:javap -c demo.jvm0104/HelloByteCode
復(fù)雜點的例子:javap -c -verbose demo.java0104.Hello
Classfile /C:/Users/29328/Desktop/abc/demo/jvm0104/HelloByteCode.classLast modified 2021-3-6; size 301 bytesMD5 checksum 542cb70faf8b2b512a023e1a8e6c1308Compiled from "HelloByteCode.java" public class demo.jvm0104.HelloByteCodeminor version: 0major version: 52flags: ACC_PUBLIC, ACC_SUPER Constant pool:#1 = Methodref #4.#13 // java/lang/Object."<init>":()V#2 = Class #14 // demo/jvm0104/HelloByteCode#3 = Methodref #2.#13 // demo/jvm0104/HelloByteCode."<init>":()V#4 = Class #15 // java/lang/Object#5 = Utf8 <init>#6 = Utf8 ()V#7 = Utf8 Code#8 = Utf8 LineNumberTable#9 = Utf8 main#10 = Utf8 ([Ljava/lang/String;)V#11 = Utf8 SourceFile#12 = Utf8 HelloByteCode.java#13 = NameAndType #5:#6 // "<init>":()V#14 = Utf8 demo/jvm0104/HelloByteCode#15 = Utf8 java/lang/Object {public demo.jvm0104.HelloByteCode();descriptor: ()Vflags: ACC_PUBLICCode:stack=1, locals=1, args_size=10: aload_01: invokespecial #1 // Method java/lang/Object."<init>":()V4: returnLineNumberTable:line 3: 0public static void main(java.lang.String[]);descriptor: ([Ljava/lang/String;)Vflags: ACC_PUBLIC, ACC_STATICCode:stack=2, locals=2, args_size=10: new #2 // class demo/jvm0104/HelloByteCode3: dup4: invokespecial #3 // Method "<init>":()V7: astore_18: returnLineNumberTable:line 5: 0line 6: 8 } SourceFile: "HelloByteCode.java"字節(jié)碼運行時節(jié)構(gòu)
Jvm是一臺基于棧的獨立計算機。
每個線程都有自己獨立的線程棧(Jvm Stack),用于存儲自己的棧幀(Frame)。
每次操作Jvm都會創(chuàng)建自己的棧幀,棧幀由操作數(shù)棧,局部變量數(shù)組及Class引用組成。
Class引用指向當前運行時常量中對應(yīng)的Class類。
四則運算例子
查看字節(jié)碼:javap -c demo.jvm0104.MovingAverage
查看字節(jié)碼:javap -c demo.jvm0104.LocalVaiableTest
算術(shù)操作與類型轉(zhuǎn)化
| int | iadd | isub | imul | idiv | irem | ineg |
| long | ladd | lsub | lmul | ldiv | lrem | lneg |
| float | fadd | fsub | fmul | fdiv | frem | fneg |
| double | dadd | dsub | dmul | ddiv | drem | dneg |
| int | - | i2l | i2f | i2d | i2b | i2c | i2s |
| long | l2i | - | l2f | l2d | - | - | - |
| float | f2i | f2l | - | f2d | - | - | - |
| double | d2i | d2l | d2f | - | - | - | - |
總結(jié)
- 上一篇: PowerDesigner中在生成的数据
- 下一篇: Spring框架设计