日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

Java字节码技术

發(fā)布時(shí)間:2024/10/6 java 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java字节码技术 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

什么是字節(jié)碼

Java bytecode是由單個(gè)(byte)組成,理論上最多支持256個(gè)操作碼(opcode)。實(shí)際上Java只用了200多個(gè)左右的操作碼,還有一些操作碼留給調(diào)試操作。

根據(jù)操作碼的性質(zhì)主要分為四大類

  • 棧操作指令,包括與局部變量操作指令
  • 程序流程控制指令
  • 對(duì)象操作指令,包括方法調(diào)用指令
  • 算數(shù)運(yùn)算及類型轉(zhuǎn)換指令
  • 生成字節(jié)碼

    寫一個(gè)最簡(jiǎn)單的類源碼如下

    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

    Compiled from "HelloByteCode.java" public class demo.jvm0104.HelloByteCode {public demo.jvm0104.HelloByteCode();Code:0: aload_01: invokespecial #1 // Method java/lang/Object."<init>":()V4: returnpublic static void main(java.lang.String[]);Code:0: new #2 // class demo/jvm0104/HelloByteCode3: dup4: invokespecial #3 // Method "<init>":()V7: astore_18: return }

    復(fù)雜點(diǎn)的例子: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é)碼運(yùn)行時(shí)節(jié)構(gòu)

    Jvm是一臺(tái)基于棧的獨(dú)立計(jì)算機(jī)。
    每個(gè)線程都有自己獨(dú)立的線程棧(Jvm Stack),用于存儲(chǔ)自己的棧幀(Frame)。
    每次操作Jvm都會(huì)創(chuàng)建自己的棧幀,棧幀由操作數(shù)棧,局部變量數(shù)組及Class引用組成。
    Class引用指向當(dāng)前運(yùn)行時(shí)常量中對(duì)應(yīng)的Class類。

    四則運(yùn)算例子

  • 編寫MovingAverage.java類
  • package demo.jvm0104;/** * 移動(dòng)平均數(shù) */ public class MovingAverage{private int count=0;private double sum=0.0D;public void submit(double value){this.count++;this.sum+=value;}public double getAvg(){if(0==this.count){return sum;}else{return this.sum/this.count;}} }
  • 編譯:javac -encoding utf-8 demo/jvm0104/MovingAverage.java
    查看字節(jié)碼:javap -c demo.jvm0104.MovingAverage
  • Compiled from "MovingAverage.java" public class demo.jvm0104.MovingAverage {public demo.jvm0104.MovingAverage();Code:0: aload_01: invokespecial #1 // Method java/lang/Object."<init>":()V4: aload_05: iconst_06: putfield #2 // Field count:I9: aload_010: dconst_011: putfield #3 // Field sum:D14: returnpublic void submit(double);Code:0: aload_01: dup2: getfield #2 // Field count:I5: iconst_16: iadd7: putfield #2 // Field count:I10: aload_011: dup12: getfield #3 // Field sum:D15: dload_116: dadd17: putfield #3 // Field sum:D20: returnpublic double getAvg();Code:0: iconst_01: aload_02: getfield #2 // Field count:I5: if_icmpne 138: aload_09: getfield #3 // Field sum:D12: dreturn13: aload_014: getfield #3 // Field sum:D17: aload_018: getfield #2 // Field count:I21: i2d22: ddiv23: dreturn }
  • 編寫LocalVariableTest.java類
  • package demo.jvm0104;public class LocalVariableTest{public static void main(String[] args){MovingAverage ma=new MovingAverage();int num1=1;int num2=2;ma.submit(num1);ma.submit(num2);double avg=ma.getAvg();} }
  • 編譯:javac -encoding utf-8 demo/jvm0104/LocalVariableTest.java
    查看字節(jié)碼:javap -c demo.jvm0104.LocalVaiableTest
  • Compiled from "LocalVariableTest.java" public class demo.jvm0104.LocalVariableTest {public demo.jvm0104.LocalVariableTest();Code:0: aload_01: invokespecial #1 // Method java/lang/Object."<init>":()V4: returnpublic static void main(java.lang.String[]);Code:0: new #2 // class demo/jvm0104/MovingAverage3: dup4: invokespecial #3 // Method demo/jvm0104/MovingAverage."<init>":()V7: astore_18: iconst_19: istore_210: iconst_211: istore_312: aload_113: iload_214: i2d15: invokevirtual #4 // Method demo/jvm0104/MovingAverage.submit:(D)V18: aload_119: iload_320: i2d21: invokevirtual #4 // Method demo/jvm0104/MovingAverage.submit:(D)V24: aload_125: invokevirtual #5 // Method demo/jvm0104/MovingAverage.getAvg:()D28: dstore 430: return

    算術(shù)操作與類型轉(zhuǎn)化

    add(+)sub(-)mult(*)divide(/)remainder(%)negate(-)
    intiaddisubimulidiviremineg
    longladdlsublmulldivlremlneg
    floatfaddfsubfmulfdivfremfneg
    doubledadddsubdmulddivdremdneg
    intlongfloatdoublebytecharshort
    int-i2li2fi2di2bi2ci2s
    longl2i-l2fl2d---
    floatf2if2l-f2d---
    doubled2id2ld2f----

    總結(jié)

    以上是生活随笔為你收集整理的Java字节码技术的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。