国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

ASM Java字節(jié)碼操作框架入門學(xué)習(xí) 輸出Hello World

這篇具有很好參考價值的文章主要介紹了ASM Java字節(jié)碼操作框架入門學(xué)習(xí) 輸出Hello World。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

ASM Java字節(jié)碼操作框架入門學(xué)習(xí) 輸出Hello World

1.類信息

package org.example;

public class Hello {

    public void say(){
        System.out.println("hello world");
    }

}

查看字節(jié)碼信息

ASM Java字節(jié)碼操作框架入門學(xué)習(xí) 輸出Hello World,JVM,學(xué)習(xí),java,開發(fā)語言

 			//動態(tài)設(shè)置棧大小
        ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_FRAMES);

       //設(shè)置類的基本信息
        classWriter.visit(
                V1_8, //設(shè)置JDK版本,
                ACC_PUBLIC, // 設(shè)置權(quán)限修飾符,
                "Hello", //新類的權(quán)限定類名,
                null,//泛型
                "java/lang/Object", // 父類
                null//實現(xiàn)的接口
        );

2.無參構(gòu)造方法

ASM Java字節(jié)碼操作框架入門學(xué)習(xí) 輸出Hello World,JVM,學(xué)習(xí),java,開發(fā)語言

0 aload_0
1 invokespecial #1 <java/lang/Object.<init> : ()V>
4 return

  			MethodVisitor constructor = classWriter.visitMethod(Opcodes.ACC_PUBLIC, "<init>", "()V", null, null);
        constructor.visitVarInsn(Opcodes.ALOAD, 0); //操作局部變量表 局部變量表第一個存放this
        constructor.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
        constructor.visitInsn(Opcodes.RETURN); // 調(diào)用  return 指令
        constructor.visitMaxs(1, 1);//方法的最大棧大小  方法的最大局部變量數(shù)
        constructor.visitEnd(); //方法結(jié)束

3.say 方法

ASM Java字節(jié)碼操作框架入門學(xué)習(xí) 輸出Hello World,JVM,學(xué)習(xí),java,開發(fā)語言文章來源地址http://www.zghlxwxcb.cn/news/detail-539725.html

0 getstatic #2 <java/lang/System.out : Ljava/io/PrintStream;>
3 ldc #3 <hello world>
5 invokevirtual #4 <java/io/PrintStream.println : (Ljava/lang/String;)V>
8 return
			//添加say方法
        MethodVisitor methodVisitor = classWriter.visitMethod(ACC_PUBLIC,//方法修飾符號
                "say",//方法名
                "()V",//方法的描述符,用于描述方法的參數(shù)類型和返回值類型
                null,//方法泛型
                null//可能拋出的異常
        );

        //獲取System.out
        methodVisitor.visitFieldInsn(
                Opcodes.GETSTATIC,//字段的類型
                "java/lang/System",//字段所屬類的全限定類名
                "out",//指定字段
                "Ljava/io/PrintStream;"http://字段描述信息
        );
        
        //加載常量
        methodVisitor.visitLdcInsn("hello world");

				
         methodVisitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL,//方法調(diào)用的操作碼   
                "java/io/PrintStream",//方法的權(quán)限定類名
                "println",//方法名
                "(Ljava/lang/String;)V", //方法修飾符
                false);//方法調(diào)用者是否是接口
                
        methodVisitor.visitInsn(Opcodes.RETURN);
        methodVisitor.visitMaxs(2, 0);
        methodVisitor.visitEnd();

4.完成類的定義并創(chuàng)建實例調(diào)用目標(biāo)方法

  			// 完成類的定義
        classWriter.visitEnd();
        // 將生成的字節(jié)碼寫入文件或加載到內(nèi)存中
        byte[] bytecode = classWriter.toByteArray();


        ClassLoader classLoader = new ClassLoader() {
            @Override
            protected Class<?> findClass(String name) throws ClassNotFoundException {
                return defineClass(name, bytecode, 0, bytecode.length);
            }
        };
        // 加載并實例化Hello類
        Class<?> helloClass = classLoader.loadClass("Hello");
        Object helloObject = helloClass.getDeclaredConstructor().newInstance();
        // 調(diào)用say方法
        helloClass.getMethod("say").invoke(helloObject);

5.相關(guān)JVM指令

方法調(diào)用

  1. invokestatic:用于調(diào)用靜態(tài)方法。該指令會根據(jù)方法的類名、方法名和方法描述符進行方法查找和調(diào)用。
  2. invokespecial:用于調(diào)用私有方法、構(gòu)造方法和父類方法。該指令會根據(jù)方法的類名、方法名和方法描述符進行方法查找和調(diào)用。
  3. invokevirtual:用于調(diào)用實例方法。該指令會根據(jù)對象的類型和方法的簽名進行方法查找和調(diào)用。
  4. invokeinterface:用于調(diào)用接口方法。該指令會根據(jù)接口的類型和方法的簽名進行方法查找和調(diào)用。
  5. invokedynamic:用于調(diào)用動態(tài)方法。該指令會通過調(diào)用動態(tài)綁定方法來實現(xiàn)方法的調(diào)用

加載常量或數(shù)字

  1. ldc:將常量(包括字符串、整數(shù)、浮點數(shù)等)加載到操作數(shù)棧上。
  2. ldc_w:與ldc類似,但用于加載較大的常量(超過65535個字節(jié))。
  3. bipush:將一個字節(jié)大小的整數(shù)常量(-128到127之間)加載到操作數(shù)棧上。
  4. sipush:將一個短整型常量(-32768到32767之間)加載到操作數(shù)棧上。
  5. iconst_:將整數(shù)常量(-1到5之間)加載到操作數(shù)棧上,其中為0到5之間的數(shù)字。 _
  6. fconst:將浮點數(shù)常量(0.0、1.0和2.0)加載到操作數(shù)棧上,其中為0到2之間的數(shù)字。
  7. dconst_:將雙精度浮點數(shù)常量(0.0和1.0)加載到操作數(shù)棧上,其中為0或1。 _
  8. _ lconst_:將長整型常量(0和1)加載到操作數(shù)棧上,其中為0或1

到了這里,關(guān)于ASM Java字節(jié)碼操作框架入門學(xué)習(xí) 輸出Hello World的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 使用ASM在Android中進行字節(jié)碼注入

    使用ASM在Android中進行字節(jié)碼注入

    1.編譯使用插件 這里自定義了一個插件用來對字節(jié)碼進行操作 首先我們需要找到這個Gradle任務(wù),雙擊進行編譯打包 打包成功后會生成如下目錄 然后我們需要在項目的gradle文件中進行引用 然后在application的model下的gradle中應(yīng)用插件 這里在Activity中加了一個點擊事件,這次是將

    2024年02月09日
    瀏覽(17)
  • 一、認(rèn)識 JVM 規(guī)范(JVM 概述、字節(jié)碼指令集、Class文件解析、ASM)

    一、認(rèn)識 JVM 規(guī)范(JVM 概述、字節(jié)碼指令集、Class文件解析、ASM)

    JVM : Java Virtual Machine ,也就是 Java 虛擬機 所謂虛擬機是指:通過軟件模擬的具有完整硬件系統(tǒng)功能的、運行在一個完全隔離環(huán)境中的計算機系統(tǒng)。 即:虛擬機是一個計算機系統(tǒng)。這種計算機系統(tǒng)運行在完全隔離的環(huán)境中,且它的硬件系統(tǒng)功能是通過軟件模擬出來的。 JVM 通

    2024年01月23日
    瀏覽(32)
  • 【Java基礎(chǔ)教程】(四十四)IO篇 · 上:File類、字節(jié)流與字符流,分析字節(jié)輸出流、字節(jié)輸入流、字符輸出流和字符輸入流的區(qū)別~

    【Java基礎(chǔ)教程】(四十四)IO篇 · 上:File類、字節(jié)流與字符流,分析字節(jié)輸出流、字節(jié)輸入流、字符輸出流和字符輸入流的區(qū)別~

    掌握 java.io包中類的繼承關(guān)系 ; 掌握 File類的使用,并且可以通過File類進行文件的創(chuàng)建、刪除以及文件夾的列表等操作; 掌握字節(jié)流或字符流操作文件內(nèi)容,字節(jié)流與字符流的區(qū)別; 在 java.io 包中,如果要進行文件自身的操作 (例如:創(chuàng)建、刪除等), 只能依靠 java.io.File 類完

    2024年02月15日
    瀏覽(29)
  • Tensorflow入門(2)——深度學(xué)習(xí)框架Tesnsflow & 線程+隊列+IO操作 & 文件讀取案例

    Tensorflow入門(2)——深度學(xué)習(xí)框架Tesnsflow & 線程+隊列+IO操作 & 文件讀取案例

    Tensorflow入門(1)——深度學(xué)習(xí)框架Tesnsflow入門 環(huán)境配置 認(rèn)識Tensorflow 在訓(xùn)練樣本的時候,希望讀入的訓(xùn)練樣本時有序的 ? tf.FIFOQueue 先進先出隊列,按順序出隊列 ? tf.RandomShuffleQueue 隨機出隊列 FIFOQueue(capacity, dtypes, name=‘fifo_queue’) 創(chuàng)建一個以先進先出的順序?qū)υ剡M行排

    2024年02月17日
    瀏覽(22)
  • java~字節(jié)碼操作Javassist

    Javassist是一個開源的Java字節(jié)碼操作庫,它提供了一組簡單而強大的API,用于在運行時修改和生成Java字節(jié)碼。Javassist的名稱是\\\"Java Programming Assistant\\\"的縮寫,它的目標(biāo)是簡化對字節(jié)碼的操作,使開發(fā)人員能夠更輕松地實現(xiàn)動態(tài)代碼生成和修改。 Javassist的主要特點包括: 簡單易

    2024年02月09日
    瀏覽(15)
  • Java字節(jié)碼編程:從入門到精通

    ??Java是一種高級語言,其代碼在編譯后被轉(zhuǎn)換為Java字節(jié)碼文件。Java字節(jié)碼文件包含了Java平臺上的指令集,這些指令可以在Java虛擬機(JVM)上執(zhí)行。因此,通過編寫和操作字節(jié)碼,我們可以在運行時動態(tài)地修改和擴展Java應(yīng)用程序的行為。 ??Java字節(jié)碼是Java編譯器生成的

    2024年02月08日
    瀏覽(21)
  • 【Java】學(xué)習(xí)一門開發(fā)語言,從TA的Hello World開始

    【Java】學(xué)習(xí)一門開發(fā)語言,從TA的Hello World開始

    歡迎來到《小5講堂》 大家好,我是全棧小5。 這是《Java》序列文章,每篇文章將以博主理解的角度展開講解, 特別是針對知識點的概念進行敘說,大部分文章將會對這些概念進行實際例子驗證,以此達(dá)到加深對知識點的理解和掌握。 溫馨提示:博主能力有限,理解水平有限

    2024年01月23日
    瀏覽(24)
  • C++輸出Hello,World

    在 C 語言中輸出 \\\"Hello, World\\\" 可以使用下面的代碼: #include stdio.h int main() { printf(\\\"Hello, Worldn\\\"); return 0; } 代碼的意思是:首先使用 #include stdio.h 告訴編譯器我們要使用輸入/輸出函數(shù),然后定義一個名為 main 的函數(shù),在函數(shù)中使用 printf 函數(shù)來輸出字符串 \\\"Hello, World\\\",最后使用

    2024年02月07日
    瀏覽(20)
  • FPGA入門學(xué)習(xí)筆記(十)Vivado設(shè)計狀態(tài)機實現(xiàn)UART多字節(jié)數(shù)據(jù)發(fā)送

    FPGA入門學(xué)習(xí)筆記(十)Vivado設(shè)計狀態(tài)機實現(xiàn)UART多字節(jié)數(shù)據(jù)發(fā)送

    使用串口發(fā)送5個字節(jié)數(shù)據(jù)到電腦 1、ADC采樣的結(jié)果為12位,如何使用串口發(fā)送 2、16位數(shù)據(jù),如何通過串口發(fā)送 3、多個字節(jié)的數(shù)據(jù),如何通過串口發(fā)送 UART規(guī)定,發(fā)送的數(shù)據(jù)位只能有6、7、8位,若直接修改發(fā)送位數(shù),接收模塊將不適配。 兩種情況: 1、沒有開始發(fā)送(上一次的

    2024年02月12日
    瀏覽(24)
  • 【IMX6ULL驅(qū)動開發(fā)學(xué)習(xí)】01.編寫第一個hello驅(qū)動+自動創(chuàng)建設(shè)備節(jié)點(不涉及硬件操作)

    【IMX6ULL驅(qū)動開發(fā)學(xué)習(xí)】01.編寫第一個hello驅(qū)動+自動創(chuàng)建設(shè)備節(jié)點(不涉及硬件操作)

    目錄 一、驅(qū)動程序編寫流程 二、代碼編寫 2.1 驅(qū)動程序hello_drv.c 2.2 測試程序 2.3 編寫驅(qū)動程序的Makefile 三、上機實驗 3.1?NFS 掛載 3.2 測試示例 構(gòu)造file_operations結(jié)構(gòu)體 在里面填充open/read/write/ioctl成員 注冊file_operations結(jié)構(gòu)體?int major = register_chrdev(0, \\\"name\\\", fops); 入口函數(shù):調(diào)用

    2024年02月13日
    瀏覽(30)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包