最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用javassist動(dòng)態(tài)生成類的配置代碼

 更新時(shí)間:2022年09月29日 14:35:04   作者:姓蔡小朋友  
Javassist它是一個(gè)用 Java 編輯字節(jié)碼的類庫(kù),它使 Java 程序能夠在運(yùn)行時(shí)定義新類,并在 JVM 加載時(shí)修改類文件,本文給大家介紹使用javassist動(dòng)態(tài)生成類的實(shí)例代碼,感興趣的朋友一起看看吧

說(shuō)明:

Javassist(JAVA 編程 ASSISTant)使 Java 字節(jié)碼操作變得簡(jiǎn)單。 它是一個(gè)用 Java 編輯字節(jié)碼的類庫(kù)。它使 Java 程序能夠在運(yùn)行時(shí)定義新類,并在 JVM 加載時(shí)修改類文件。 與其他類似的字節(jié)碼編輯器不同,Javassist 提供兩個(gè)級(jí)別的 API:源級(jí)別和字節(jié)碼級(jí)別。 如果用戶使用源級(jí) API,他們可以在不知道 Java 字節(jié)碼規(guī)范的情況下編輯類文件。 整個(gè) API 僅使用 Java 語(yǔ)言的詞匯表進(jìn)行設(shè)計(jì)。 您甚至可以以源文本的形式指定插入的字節(jié)碼;Javassist 即時(shí)編譯它。 另一方面,字節(jié)碼級(jí) API 允許用戶直接編輯類文件作為其他編輯器。

配置環(huán)境:

  • javassist依賴:
<dependency>
  <groupId>org.javassist</groupId>
  <artifactId>javassist</artifactId>
  <version>3.29.1-GA</version>
</dependency>
  • 環(huán)境配置:

–add-opens java.base/java.lang=ALL-UNNAMED
–add-opens java.base/sun.net.util=ALL-UNNAMED

請(qǐng)?zhí)砑訄D片描述

使用javassist生成類:

代碼:

package com.user;

import javassist.*;
import java.lang.reflect.Method;

public class JavassistTest {
    public static void main(String[] args) throws Exception{
        //獲取類池
        ClassPool pool = ClassPool.getDefault();
        //通過(guò)類路徑創(chuàng)建類
        CtClass ctClass = pool.makeClass("com.user.Test");
        //為類創(chuàng)建方法(參數(shù):1.方法返回值類型 2.方法名 3.方法形參列表 4.方法所屬類)
        CtMethod ctMethod = new CtMethod(CtClass.voidType, "execute", new CtClass[]{}, ctClass);
        //設(shè)置方法的修飾符列表
        ctMethod.setModifiers(Modifier.PUBLIC);
        //設(shè)置方法體
        ctMethod.setBody("{System.out.println(\"hello world\");}");
        //給類添加方法
        ctClass.addMethod(ctMethod);
        //測(cè)試:使用反射機(jī)制測(cè)試方法調(diào)用
        Class<?> aClass = ctClass.toClass();
        Object o = aClass.newInstance();
        Method method = aClass.getDeclaredMethod("execute");
        method.invoke(o);

    }
}

執(zhí)行結(jié)果:

請(qǐng)?zhí)砑訄D片描述

使用javassist生成類并實(shí)現(xiàn)接口:

接口已定義好:

package com.user;

public interface Dao {
    public  int insert();
    public  int delete();
    public  int update();
    public  void select();
}

代碼:

package com.user;

import javassist.*;

import java.lang.reflect.Method;
import java.util.Arrays;

public class JavassistTestImpl {
    public static void main(String[] args) throws Exception {
        //獲取類池
        ClassPool pool = ClassPool.getDefault();
        //制造類
        CtClass ctClass = pool.makeClass("com.user.TestImpl");
        //制造接口
        CtClass ctInterface = pool.makeInterface("com.user.Dao");
        //類實(shí)現(xiàn)接口
        ctClass.addInterface(ctInterface);
        //獲取接口中的所有方法
        Method[] methods = Dao.class.getDeclaredMethods();
        //類實(shí)現(xiàn)接口中的所有方法
        Arrays.stream(methods).forEach(method->{
            try {
                //拼接方法頭+方法體
                StringBuilder sb = new StringBuilder();
                sb.append("public");//方法修飾符
                sb.append(" ");
                sb.append(method.getReturnType().getName());//方法返回值類型
                sb.append(" ");
                sb.append(method.getName());//方法名
                sb.append("(");
                Class<?>[] parameterTypes = method.getParameterTypes();
                for (int i = 0; i < parameterTypes.length; i++) {
                    sb.append(parameterTypes[i].getName());//參數(shù)類型
                    sb.append(" ");
                    sb.append("arg"+i);//參數(shù)名,隨意指定,但不能重名
                    if(i != parameterTypes.length-1) {
                        sb.append(",");
                    }
                }
                sb.append(")");
                sb.append("{");
                String simpleName = method.getReturnType().getSimpleName();//根據(jù)返回值類型寫return語(yǔ)句
                if("String".equals(simpleName)){
                    sb.append("return \"hello\";");
                }else if("int".equals(simpleName)){
                    sb.append("return 1;");
                }else if("void".equals(simpleName)){
                    sb.append("System.out.println(\"hello\");");
                }
                sb.append("}");
                //創(chuàng)建方法(參數(shù):方法頭+方法體,所屬類)
                CtMethod ctMethod = CtNewMethod.make(sb.toString(),ctClass);
                ctClass.addMethod(ctMethod);
            } catch (CannotCompileException e) {
                e.printStackTrace();
            }
        });
        //測(cè)試
        Class<?> aClass = ctClass.toClass();
        Dao o = (Dao)aClass.newInstance();
        o.select();
        System.out.println(o.insert());
    }
}

執(zhí)行結(jié)果:

請(qǐng)?zhí)砑訄D片描述

到此這篇關(guān)于使用javassist動(dòng)態(tài)生成類的文章就介紹到這了,更多相關(guān)javassist動(dòng)態(tài)生成類內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • maven引入kabeja依賴的實(shí)現(xiàn)步驟

    maven引入kabeja依賴的實(shí)現(xiàn)步驟

    本文主要介紹了maven引入kabeja依賴的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-09-09
  • Java的接口調(diào)用時(shí)的權(quán)限驗(yàn)證功能的實(shí)現(xiàn)

    Java的接口調(diào)用時(shí)的權(quán)限驗(yàn)證功能的實(shí)現(xiàn)

    這篇文章主要介紹了Java的接口調(diào)用時(shí)的權(quán)限驗(yàn)證功能的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Java內(nèi)存釋放實(shí)現(xiàn)代碼案例

    Java內(nèi)存釋放實(shí)現(xiàn)代碼案例

    這篇文章主要介紹了Java內(nèi)存釋放實(shí)現(xiàn)代碼案例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-12-12
  • Spring IOC源碼剖析_如何整體認(rèn)知Spring體系結(jié)構(gòu)

    Spring IOC源碼剖析_如何整體認(rèn)知Spring體系結(jié)構(gòu)

    這篇文章主要介紹了Spring IOC源碼剖析_如何整體認(rèn)知Spring體系結(jié)構(gòu)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • SpringBoot3.4集成Seata的詳細(xì)指南

    SpringBoot3.4集成Seata的詳細(xì)指南

    當(dāng)Spring Boot 3.4與Seata 2.0相遇,分布式事務(wù)的復(fù)雜性被壓縮至一行注解,所以這篇文章小編就來(lái)和大家詳細(xì)介紹一下SpringBoot3.4集成Seata的具體步驟吧
    2025-04-04
  • 記一次用IDEA打開java項(xiàng)目后不能運(yùn)行的解決方法

    記一次用IDEA打開java項(xiàng)目后不能運(yùn)行的解決方法

    這篇文章主要介紹了記一次用IDEA打開java項(xiàng)目后不能運(yùn)行的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Java集合類之Map集合的特點(diǎn)及使用詳解

    Java集合類之Map集合的特點(diǎn)及使用詳解

    這篇文章主要為大家詳細(xì)介紹一下Java集合類中Map的特點(diǎn)及使用,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Java有一定幫助,感興趣的可以了解一下
    2022-08-08
  • Java非遞歸實(shí)現(xiàn)刪除任意目錄的方法

    Java非遞歸實(shí)現(xiàn)刪除任意目錄的方法

    這篇文章主要為大家詳細(xì)介紹了Java非遞歸實(shí)現(xiàn)刪除任意目錄的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • java實(shí)現(xiàn)一個(gè)接口調(diào)取另一個(gè)接口(接口一調(diào)取接口二)

    java實(shí)現(xiàn)一個(gè)接口調(diào)取另一個(gè)接口(接口一調(diào)取接口二)

    這篇文章主要介紹了java實(shí)現(xiàn)一個(gè)接口調(diào)取另一個(gè)接口(接口一調(diào)取接口二),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java中為什么ArrayList初始化容量大小為10

    Java中為什么ArrayList初始化容量大小為10

    這篇文章主要介紹了Java中為什么ArrayList初始化容量大小為10,帶著問(wèn)題圍展開詳細(xì)的介紹,感興趣的小伙伴可以參考一下
    2022-06-06

最新評(píng)論

孟州市| 清新县| 平谷区| 河源市| 阿克陶县| 卫辉市| 岐山县| 涿鹿县| 三门县| 图们市| 延吉市| 星座| 勐海县| 开封市| 贵溪市| 鹰潭市| 铁力市| 兰州市| 利津县| 新巴尔虎右旗| 康乐县| 犍为县| 永新县| 甘南县| 榆树市| 达州市| 无锡市| 定西市| 三门峡市| 瓦房店市| 江安县| 科尔| 万安县| 隆德县| 柘荣县| 旅游| 永安市| 开阳县| 红桥区| 镇平县| 镇坪县|