成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Javassist 字節(jié)碼學(xué)習(xí) HelloWorld,看到這樣的代碼就覺得自己會了

開發(fā) 前端
兩個框架都是有強大的 API,操作使用上更加容易控制。雖然對對比上會比 ASM 性能差一些,但不是說性能完全不好。同樣在一些監(jiān)控場景中也用的非常多。如果你細心可以在你的工程 jar 包搜索一下。

一、前言

在字節(jié)碼編程方面有三個比較常見的框架;ASM、byte-buddy、Javassist,他們都可以對這字節(jié)碼進行操作,只是操作方式和控制粒度不同。

其中 ASM 更偏向于底層,需要了解 JVM 虛擬機中指定規(guī)范以及對局部變量以及操作數(shù)棧的知識。雖然在編寫起來比較麻煩,但是它也是性能最好功能最強的字節(jié)碼操作框架。常見的會用在 CGLIB 動態(tài)代理類中,以及一些非入侵的探針監(jiān)控場景中。

另外兩個框架都是有強大的 API,操作使用上更加容易控制。雖然對對比上會比 ASM 性能差一些,但不是說性能完全不好。同樣在一些監(jiān)控場景中也用的非常多。如果你細心可以在你的工程 jar 包搜索一下。

在這之前我已經(jīng)編寫了 Javaagent全鏈路監(jiān)控 和 ASM 的部分文章,雖然這部分技術(shù)內(nèi)容在 CRUD 開發(fā)中并不常用,但隨著自動化測試、非入侵監(jiān)控的大量使用,還是蠻多人需要這樣的技能學(xué)習(xí)的。同時我也是這樣一個技能的學(xué)習(xí)者,為此后面會陸續(xù)編寫和完善關(guān)于 字節(jié)碼編程 這個專欄。也希望這個專欄在提升自己技術(shù)棧的同時也幫助他人成長。

那么,小傅哥計劃從 Javassist 到 ASM 陸續(xù)完成整套專欄學(xué)習(xí)的文章編寫。從簡單入門到應(yīng)用操作,一步步來完成成體系的技術(shù)知識棧學(xué)習(xí)。

好!,現(xiàn)在開始第一個Helloworld案例。相關(guān)源碼可以通過關(guān)注 公眾號:bugstack蟲洞棧 獲取

二、開發(fā)環(huán)境

  1. JDK 1.8.0
  2. javassist 3.12.1.GA <dependency>
    <groupId>javassist</groupId>
    <artifactId>javassist</artifactId>
    <version>3.12.1.GA</version>
    <type>jar</type>
    </dependency>

三、案例目標(biāo)

不看實現(xiàn)過程的話,我們的案例目標(biāo)其實很簡單,就是使用 javassist 輸出一行 Helloworld 。這話像不像產(chǎn)品說的

public class HelloWorld {
public static void main(String[] args) {
System.out.println("javassist hi helloworld by 小傅哥(bugstack.cn)");
}

public HelloWorld() {
}
}

以上的這段代碼就是我們接下來需要使用字節(jié)碼編程技術(shù)來實現(xiàn)的內(nèi)容。

四、技術(shù)實現(xiàn)

其實輸出一個 Helloworld 還是蠻簡單的,主要是從這里面去學(xué)習(xí)一下 Javassist 的基本語法結(jié)構(gòu),也能為后續(xù)的學(xué)習(xí)有一個基礎(chǔ)的概念。

javassist Helloworld

/**
* 公眾號:bugstack蟲洞棧
* 博客棧:https://bugstack.cn - 沉淀、分享、成長,讓自己和他人都能有所收獲!
* 本專欄是小傅哥多年從事一線互聯(lián)網(wǎng)Java開發(fā)的學(xué)習(xí)歷程技術(shù)匯總,旨在為大家提供一個清晰詳細的學(xué)習(xí)教程。如果能為您提供幫助,請給予支持(關(guān)注、點贊、分享)!
*/
public class GenerateClazzMethod {


public static void main(String[] args) throws IOException, CannotCompileException, NotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {

ClassPool pool = ClassPool.getDefault();

// 創(chuàng)建類 classname:創(chuàng)建類路徑和名稱
CtClass ctClass = pool.makeClass("org.itstack.demo.javassist.HelloWorld");

// 添加方法
CtMethod mainMethod = new CtMethod(CtClass.voidType, "main", new CtClass[]{pool.get(String[].class.getName())}, ctClass);
mainMethod.setModifiers(Modifier.PUBLIC + Modifier.STATIC);
mainMethod.setBody("{System.out.println(\"javassist hi helloworld by 小傅哥(bugstack.cn)\");}");
ctClass.addMethod(mainMethod);

// 創(chuàng)建無參數(shù)構(gòu)造方法
CtConstructor ctConstructor = new CtConstructor(new CtClass[]{}, ctClass);
ctConstructor.setBody("{}");
ctClass.addConstructor(ctConstructor);

// 輸出類內(nèi)容
ctClass.writeFile();

// 測試調(diào)用
Class clazz = ctClass.toClass();
Object obj = clazz.newInstance();

Method main = clazz.getDeclaredMethod("main", String[].class);
main.invoke(obj, (Object)new String[1]);

}

}

這段代碼分為幾塊內(nèi)容來實現(xiàn)功能,分別包括;

  1. 創(chuàng)建 ClassPool,它是一個基于HashMap實現(xiàn)的 CtClass 對象容器。
  2. 使用 CtClass,創(chuàng)建我們的類信息,也就是類的路徑和名稱。
  3. 接下來就是給類添加方法。包括;方法的屬性、類型、名稱、入?yún)ⅰ⒊鰠⒑头椒w的內(nèi)容。
  4. 在方法創(chuàng)建好后還需要創(chuàng)建一個空的構(gòu)造函數(shù),每一個類都會在編譯后生成這樣一個構(gòu)造函數(shù)。
  5. 當(dāng)方法創(chuàng)建完成后,我們使用 ctClass.writeFile() 進行輸出方法的內(nèi)容信息。也就可以看到通過我們使用 Javassist 生成類的樣子。
  6. 最后就是我們的反射調(diào)用 main 方法,測試輸出結(jié)果。

五、測試結(jié)果

當(dāng)我們執(zhí)行測試的時候會輸出類信息到工程文件夾下,同時會輸出我們的測試結(jié)果;

1. 使用Javassist生成的類

使用Javassist生成的類,在工程文件夾下

2. 輸出的測試結(jié)果

javassist hi helloworld by 小傅哥(bugstack.cn)

Process finished with exit code 0

六、總結(jié)

  • 關(guān)于 Javassist 的使用在完整的且強大的 API 下,確實還是蠻容易使用的。并且代碼的使用上并不是很難理解。
責(zé)任編輯:武曉燕 來源: 今日頭條
相關(guān)推薦

2023-03-27 16:44:23

2019-10-30 08:45:21

JS代碼NodeJS

2024-01-30 07:41:20

Java代碼操作庫

2020-09-03 11:04:20

Spring 循環(huán)依賴

2021-02-01 11:22:23

Windows 10Windows微軟

2022-11-16 08:33:29

監(jiān)聽Spring監(jiān)聽器

2023-08-30 11:03:47

Java工具

2021-02-08 11:20:27

Java類型數(shù)組

2024-11-29 08:53:46

2013-09-16 10:03:06

代碼碼農(nóng)

2022-09-15 08:41:16

數(shù)據(jù)異構(gòu)分庫分表

2010-03-22 12:40:48

Python代碼加密

2016-01-21 09:55:51

2020-11-20 16:44:12

信息安全數(shù)據(jù)網(wǎng)絡(luò)

2022-12-05 09:08:12

微服務(wù)灰度發(fā)布

2021-12-30 11:30:13

人工智能機器學(xué)習(xí)技術(shù)

2023-03-23 15:18:03

JavaScrip代碼實踐

2024-06-20 12:30:34

2011-12-01 14:56:30

Java字節(jié)碼

2020-12-14 08:07:06

Mybatis源碼java
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 一区二区三区日韩 | 国产欧美在线播放 | 免费观看av | 99re视频在线 | 一区二区在线不卡 | 欧美美女爱爱视频 | 欧美中文字幕在线观看 | 热久久国产| 一区二区在线 | 日韩精品一区二区三区免费观看 | 97超碰在线播放 | 日日干夜夜操天天操 | 在线免费观看成年人视频 | 日韩久久久久久 | 国产一区二区三区视频 | 青春草国产 | 久久一区二区三区免费 | 国产一区二区麻豆 | 久久精品二区亚洲w码 | 国产免费一区二区 | 精品欧美一区二区三区久久久 | 欧美黑人一级爽快片淫片高清 | 91久久国产综合久久 | 一区二区高清在线观看 | 欧美成人高清视频 | 韩日av在线| 久久综合av | 久久69精品久久久久久国产越南 | av在线天天| 国产精品久久久久久久久久三级 | 国产成人精品久久 | 九九在线视频 | 久久精品久久久久久 | 日本不卡一区二区三区在线观看 | 日韩亚洲视频 | 日日久| 日韩精品欧美精品 | 97碰碰碰 | 亚洲一区久久 | 秋霞av国产精品一区 | 日韩欧美二区 |