欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java字節(jié)碼的增強技術(shù)

 更新時間:2021年08月30日 17:25:21   作者:阿凡盧  
這篇文章簡單介紹了幾種Java字節(jié)碼的增強技術(shù),如ASM、Javassist、Byte Buddy、JVM-SANDBOX,需要的朋友可以參下面文章

Java字節(jié)碼的增強技術(shù)

一、簡單介紹下幾種java字節(jié)碼增強技術(shù)

1、ASM

ASM是一個Java字節(jié)碼操控框架,它能被用來動態(tài)生成類或者增強既有類的功能。ASM可以直接產(chǎn)生class文件,也可以在類被加載入Java虛擬機之前動態(tài)改變類行為。ASM從類文件中讀入信息后,能夠改變類行為,分析類信息,甚至能夠根據(jù)用戶要求生成新類。

ASM框架中的核心類有以下幾個:

 ?、?nbsp; ClassReader:該類用來解析編譯過的class字節(jié)碼文件。

 ?、?nbsp; ClassWriter:該類用來重新構(gòu)建編譯后的類,比如說修改類名、屬性以及方法,甚至可以生成新的類的字節(jié)碼文件。

  ③  ClassAdapter:該類也實現(xiàn)了ClassVisitor接口,它將對它的方法調(diào)用委托給另一個ClassVisitor對象。

參考代碼:

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.Opcodes;

public class GeneratorClass {

    public static void main(String[] args) throws IOException {
        //生成一個類只需要ClassWriter組件即可
        ClassWriter cw = new ClassWriter(0);
        //通過visit方法確定類的頭部信息
        cw.visit(Opcodes.V1_5, Opcodes.ACC_PUBLIC+Opcodes.ACC_ABSTRACT+Opcodes.ACC_INTERFACE,
                "com/asm3/Comparable", null, "java/lang/Object", new String[]{"com/asm3/Mesurable"});
        //定義類的屬性
        cw.visitField(Opcodes.ACC_PUBLIC+Opcodes.ACC_FINAL+Opcodes.ACC_STATIC,
                "LESS", "I", null, new Integer(-1)).visitEnd();
        cw.visitField(Opcodes.ACC_PUBLIC+Opcodes.ACC_FINAL+Opcodes.ACC_STATIC,
                "EQUAL", "I", null, new Integer(0)).visitEnd();
        cw.visitField(Opcodes.ACC_PUBLIC+Opcodes.ACC_FINAL+Opcodes.ACC_STATIC,
                "GREATER", "I", null, new Integer(1)).visitEnd();
        //定義類的方法
        cw.visitMethod(Opcodes.ACC_PUBLIC+Opcodes.ACC_ABSTRACT, "compareTo",
                "(Ljava/lang/Object;)I", null, null).visitEnd();
        cw.visitEnd(); //使cw類已經(jīng)完成
        //將cw轉(zhuǎn)換成字節(jié)數(shù)組寫到文件里面去
        byte[] data = cw.toByteArray();
        File file = new File("D://Comparable.class");
        FileOutputStream fout = new FileOutputStream(file);
        fout.write(data);
        fout.close();
    }
}

2、Javassist

Javassist是一個開源的分析、編輯和創(chuàng)建Java字節(jié)碼的類庫。

它已加入了開放源代碼JBoss應(yīng)用服務(wù)器項目,通過使用Javassist對字節(jié)碼操作為JBoss實現(xiàn)動態(tài)"AOP"框架。

利用Javassist實現(xiàn)字節(jié)碼增強時,可以無須關(guān)注字節(jié)碼刻板的結(jié)構(gòu),其優(yōu)點就在于編程簡單。直接使用java編碼的形式,而不需要了解虛擬機指令,就能動態(tài)改變類的結(jié)構(gòu)或者動態(tài)生成類。其中最重要的是ClassPool、CtClass、CtMethod、CtField這四個類:

  • CtClass(compile-time class):編譯時類信息,它是一個class文件在代碼中的抽象表現(xiàn)形式,可以通過一個類的全限定名來獲取一個CtClass對象,用來表示這個類文件。
  • ClassPool:從開發(fā)視角來看,ClassPool是一張保存CtClass信息的HashTable,key為類名,value為類名對應(yīng)的CtClass對象。當(dāng)我們需要對某個類進(jìn)行修改時,就是通過pool.getCtClass(“className”)方法從pool中獲取到相應(yīng)的CtClass。
  • CtMethod、CtField:這兩個比較好理解,對應(yīng)的是類中的方法和屬性。

參考代碼:

import javassist.*;

public class CreatePerson {

    public static void createPseson() throws Exception {
        ClassPool pool = ClassPool.getDefault();

        // 1. 創(chuàng)建一個空類
        CtClass cc = pool.makeClass("com.test.javassist.Person");

        // 2. 新增一個字段 private String name;
        // 字段名為name
        CtField param = new CtField(pool.get("java.lang.String"), "name", cc);
        // 訪問級別是 private
        param.setModifiers(Modifier.PRIVATE);
        // 初始值是 "xiaoming"
        cc.addField(param, CtField.Initializer.constant("xiaoming"));

        // 3. 生成 getter、setter 方法
        cc.addMethod(CtNewMethod.setter("setName", param));
        cc.addMethod(CtNewMethod.getter("getName", param));

        // 4. 添加無參的構(gòu)造函數(shù)
        CtConstructor cons = new CtConstructor(new CtClass[]{}, cc);
        cons.setBody("{name = \"xiaohong\";}");
        cc.addConstructor(cons);

        // 5. 添加有參的構(gòu)造函數(shù)
        cons = new CtConstructor(new CtClass[]{pool.get("java.lang.String")}, cc);
        // $0=this / $1,$2,$3... 代表方法參數(shù)
        cons.setBody("{$0.name = $1;}");
        cc.addConstructor(cons);

        // 6. 創(chuàng)建一個名為printName方法,無參數(shù),無返回值,輸出name值
        CtMethod ctMethod = new CtMethod(CtClass.voidType, "printName", new CtClass[]{}, cc);
        ctMethod.setModifiers(Modifier.PUBLIC);
        ctMethod.setBody("{System.out.println(name);}");
        cc.addMethod(ctMethod);

        //這里會將這個創(chuàng)建的類對象編譯為.class文件
        cc.writeFile("/Users/yangyue/workspace/springboot-learn/java-agent/src/main/java/");
    }

    public static void main(String[] args) {
        try {
            createPseson();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

3、Byte Buddy

Byte Buddy是一個代碼生成和操作庫,用于在Java應(yīng)用程序運行時創(chuàng)建和修改Java類,而無需編譯器的幫助。
除了Java類庫附帶的代碼生成實用程序外,Byte Buddy還允許創(chuàng)建任意類,并且不限于實現(xiàn)用于創(chuàng)建運行時代理的接口。
此外,Byte Buddy提供了一種方便的API,可以使用Java代理或在構(gòu)建過程中手動更改類。

參考代碼:

Class<?> dynamicType = new ByteBuddy()
  .subclass(Object.class)
  .method(ElementMatchers.named("toString"))
  .intercept(FixedValue.value("Hello World!"))
  .make()
  .load(getClass().getClassLoader())
  .getLoaded();
 
assertThat(dynamicType.newInstance().toString(), is("Hello World!"));

4、JVM-SANDBOX

JVM沙箱容器,一種JVM的非侵入式運行期AOP解決方案:

動態(tài)增強類你所指定的類,獲取你想要的參數(shù)和行信息甚至改變方法執(zhí)行。
動態(tài)可插拔容器框架。

到此這篇關(guān)于Java字節(jié)碼的增強技術(shù)的文章就介紹到這了,更多相關(guān)Java字節(jié)碼增強內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java實現(xiàn)的小時鐘示例分享

    java實現(xiàn)的小時鐘示例分享

    這篇文章主要介紹了java實現(xiàn)的小時鐘示例,需要的朋友可以參考下
    2014-02-02
  • java實現(xiàn)雙人五子棋游戲

    java實現(xiàn)雙人五子棋游戲

    這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)雙人五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • 一文讀懂Spring Cloud-Hystrix

    一文讀懂Spring Cloud-Hystrix

    這篇文章主要介紹了通過一文讀懂Spring Cloud-Hystrix的相關(guān)知識,本文分步驟通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • Java web三件套listener、filter、servelt原理解析

    Java web三件套listener、filter、servelt原理解析

    這篇文章主要介紹了Java web三件套listener、filter、servelt原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-03-03
  • SpringBoot使用@Validated處理校驗的方法步驟

    SpringBoot使用@Validated處理校驗的方法步驟

    @Validated?注解的主要目的是啟用和利用?Spring?的驗證框架,它可以用于類上也可以用于方法參數(shù)上,本文給大家介紹了SpringBoot使用@Validated優(yōu)雅的處理校驗的方法步驟,通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2024-08-08
  • Eclipse如何導(dǎo)入Maven項目詳解(新手初學(xué))

    Eclipse如何導(dǎo)入Maven項目詳解(新手初學(xué))

    這篇文章主要介紹了Eclipse如何導(dǎo)入Maven項目詳解(新手初學(xué)),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12
  • 詳解JAVA 字節(jié)流和字符流

    詳解JAVA 字節(jié)流和字符流

    這篇文章主要介紹了JAVA 字節(jié)流和字符流的的相關(guān)資料,文中講解非常的細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • Mybatis之mapper接口多參數(shù)方式

    Mybatis之mapper接口多參數(shù)方式

    這篇文章主要介紹了Mybatis之mapper接口多參數(shù)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • 在springboot中使用p6spy方式

    在springboot中使用p6spy方式

    這篇文章主要介紹了在springboot中使用p6spy方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • SpringBoot中Redisson延遲隊列的示例

    SpringBoot中Redisson延遲隊列的示例

    延時隊列是一種常見的需求,延時隊列允許我們延遲處理某些任務(wù),本文主要介紹了Redisson延遲隊列的示例,具有一定的參考價值,感興趣的可以了解一下
    2024-06-06

最新評論