亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

Java知識(shí)點(diǎn)總結(jié)(動(dòng)態(tài)字節(jié)碼操作-Javassist介紹)

godruoyi / 1395人閱讀

摘要:知識(shí)點(diǎn)總結(jié)動(dòng)態(tài)字節(jié)碼操作介紹知識(shí)點(diǎn)總結(jié)動(dòng)態(tài)字節(jié)碼操作運(yùn)行時(shí)操作字節(jié)碼可以讓我們實(shí)現(xiàn)如下功能動(dòng)態(tài)生成新的類動(dòng)態(tài)改變某個(gè)類的結(jié)構(gòu)添加刪除修改新的屬性方法常見的字節(jié)碼操作類庫(kù),這是的項(xiàng)目的一部分。

Java知識(shí)點(diǎn)總結(jié)(動(dòng)態(tài)字節(jié)碼操作-Javassist介紹)

@(Java知識(shí)點(diǎn)總結(jié))[Java, 動(dòng)態(tài)字節(jié)碼操作]

運(yùn)行時(shí)操作字節(jié)碼可以讓我們實(shí)現(xiàn)如下功能:

動(dòng)態(tài)生成新的類

動(dòng)態(tài)改變某個(gè)類的結(jié)構(gòu)(添加/刪除/修改 新的屬性/方法)

java常見的字節(jié)碼操作類庫(kù)
BCEL

Byte Code Engineering Library (BCEL) ,這是 Apache Software Foundation 的 Jakarta 項(xiàng)目的一部分。 BCEL 是 Java classworking 廣泛 使用的一種 框架 , 它 可以讓您深入 JVM 匯編語(yǔ)言進(jìn)行類操作的細(xì)節(jié)。 BCEL 與 Javassist 有不同的處理字節(jié)碼方法, BCEL 在實(shí)際的 JVM 指令層次上進(jìn)行操作 (BCEL 擁有豐富的 JVM 指令級(jí)支持 ) 而 Javassist 所 強(qiáng)調(diào) 的是源代碼 級(jí)別的 工作 。

ASM

是一個(gè)輕量級(jí) java 字節(jié)碼操作框架,直接涉及到 JVM 底層的操作和 指令

CGLIB(Code Generation Library)

是一個(gè)強(qiáng)大的,高性能,高質(zhì)量的 Code

Javassist

是 一個(gè)開源的分析、編輯和創(chuàng)建 Java 字節(jié)碼 的類庫(kù) 。性能較 ASM 差,跟 cglib 差不多,但是使用簡(jiǎn)單。很多開源框架都在使用它 。

   主頁(yè):http://www.csg.ci.i.u-tokyo.ac.jp/~ chiba/javassist 

Javassist

使用Javassist需要使用javassist.jar

優(yōu)勢(shì):

比反射開銷小,性能高。

JAVAsist性能高于反射,低于ASM

局限性:

JDK新語(yǔ)法不支持(包括泛型、枚舉),不支持注解修改,但可以通過底層的javasist類來解決,具體參考:javassist.bytecode.annotaion

不支持?jǐn)?shù)組的初始化,如 String[]{"1","2"},除非只有數(shù)組的容量為1

不支持內(nèi)部類和匿名類

不支持 continue 和 break 表達(dá)式。

對(duì)于繼承關(guān)系,有些不支持 。例如:- class A{} - class B extends A{} - class C enxends B {}

應(yīng)用場(chǎng)景:

AOP:

給一個(gè)類增加新的方法

給一段語(yǔ)句前面和后面(before/after/around)動(dòng)態(tài)的加代碼

Reflection:起到類似反射的效果


javassist 的最外層的 API 和 JAVA 的反射包中的 API 頗為類似 。

它主要由 CtClass , CtMethod, ,以及 CtField 幾個(gè)類組成。用以執(zhí)行和 JDK 反射 API 中 java.lang.Class , java.lang.reflect.Method , java.lang.reflect.Method .Field 相同的 操作 。

方法操作

修改已有方法的方法體體(插入代碼到已有方法體)

新增方法 刪除方法

占位符參數(shù)介紹:

示例:

import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtConstructor;
import javassist.CtField;
import javassist.CtMethod;
/**
 * 創(chuàng)建一個(gè)新的類
 * @author Administrator
 *
 */
public class Test10 {
  public static void main(String[] args) throws Exception {
    ClassPool pool = ClassPool.getDefault(); // 類池
    CtClass class1 = pool.makeClass("com.gs.Emp");
    
    //創(chuàng)建屬性
    CtField f1 = CtField.make("private int num;", class1);
    CtField f2 = CtField.make("private String name;", class1);
    class1.addField(f1);
    class1.addField(f2);
    
    //創(chuàng)建方法
    CtMethod setName = CtMethod.make("public void setName(String name){this.name = name;}", class1);
    CtMethod getName = CtMethod.make("public String getName(){return name;}", class1);
    class1.addMethod(setName);
    class1.addMethod(getName);
    
    //添加構(gòu)造器。  如果是帶參構(gòu)造器,需要傳遞參數(shù)類型,基本數(shù)據(jù)類型用CtClass獲取,引用類型,需要用pool獲取
    CtConstructor constructor = new CtConstructor(new CtClass[]{CtClass.intType,pool.get("java.lang.String")}, class1);
    constructor.setBody("{this.num = num;this.name = name;}"); //構(gòu)造器的方法體
    
    class1.writeFile("E:/myjava"); //將上面寫好的類,寫入到這個(gè)工作空間中
    
    System.out.println("生成類成功!");
  }
}

執(zhí)行結(jié)果:
生成類成功!


使用反編譯工具xjad打開:

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/71627.html

相關(guān)文章

  • Java識(shí)點(diǎn)總結(jié)動(dòng)態(tài)字節(jié)操作-Javassist的API使用)

    摘要:因此,若想對(duì)對(duì)象進(jìn)行修改,必須對(duì)其進(jìn)行解凍,通過方法進(jìn)行生成一個(gè)方法生成一個(gè)方法通過反射調(diào)用生成的方法方法體前面和后面加執(zhí)行語(yǔ)句方法體前面通過反射調(diào)用生成的方法張三生成屬性和方法獲取屬性生成構(gòu)造器可以在構(gòu)造器前后加代碼注解操作 Java知識(shí)點(diǎn)總結(jié)(動(dòng)態(tài)字節(jié)碼操作-Javassist的API使用) @(Java知識(shí)點(diǎn)總結(jié))[Java, 動(dòng)態(tài)字節(jié)碼操作] 參考文章: 傳送 操作示例: pu...

    U2FsdGVkX1x 評(píng)論0 收藏0
  • Java動(dòng)態(tài)編程初探

    摘要:動(dòng)態(tài)編程使用場(chǎng)景通過配置生成代碼,減少重復(fù)編碼,降低維護(hù)成本。動(dòng)態(tài)生成字節(jié)碼操作字節(jié)碼的工具有,其中有兩個(gè)比較流行的,一個(gè)是,一個(gè)是。 作者簡(jiǎn)介 傳恒,一個(gè)喜歡攝影和旅游的軟件工程師,先后從事餓了么物流蜂鳥自配送和蜂鳥眾包的開發(fā),現(xiàn)在轉(zhuǎn)戰(zhàn) Java,目前負(fù)責(zé)物流策略組分流相關(guān)業(yè)務(wù)的開發(fā)。 什么是動(dòng)態(tài)編程 動(dòng)態(tài)編程是相對(duì)于靜態(tài)編程而言的,平時(shí)我們討論比較多的靜態(tài)編程語(yǔ)言例如Java, 與動(dòng)態(tài)...

    趙連江 評(píng)論0 收藏0
  • Android 性能監(jiān)控系列一(原理篇)

    摘要:全稱應(yīng)用性能管理監(jiān)控后面我會(huì)通過一系列的文章來介紹的原理框架設(shè)計(jì)與實(shí)現(xiàn)等等。在應(yīng)用構(gòu)建期間,通過修改字節(jié)碼的方式來進(jìn)行字節(jié)碼插樁就是實(shí)現(xiàn)自動(dòng)化的方案之一。 showImg(https://segmentfault.com/img/bVbbRX6?w=1995&h=1273); 歡迎關(guān)注微信公眾號(hào):BaronTalk,獲取更多精彩好文! 一. 前言 性能問題是導(dǎo)致 App 用戶流失的罪魁...

    yacheng 評(píng)論0 收藏0
  • Java 動(dòng)態(tài)性(4) - 字節(jié)操作

    摘要:字節(jié)碼操作動(dòng)態(tài)性的兩種常見實(shí)現(xiàn)方式字節(jié)碼操作反射運(yùn)行時(shí)操作字節(jié)碼可以讓我們實(shí)現(xiàn)如下功能動(dòng)態(tài)生成新的類動(dòng)態(tài)改變某個(gè)類的結(jié)構(gòu)添加刪除修改新的屬性方法優(yōu)勢(shì)比反射開銷小性能高性能高于反射低于常見的字節(jié)碼操作類庫(kù)這是的項(xiàng)目的一部分是廣泛使用的一種框它 1.字節(jié)碼操作 JAVA動(dòng)態(tài)性的兩種常見實(shí)現(xiàn)方式字節(jié)碼操作 反射 運(yùn)行時(shí)操作字節(jié)碼可以讓我們實(shí)現(xiàn)如下功能動(dòng)態(tài)生成新的類 動(dòng)態(tài)改變某個(gè)類的結(jié)構(gòu)(...

    CoderStudy 評(píng)論0 收藏0
  • 深入字節(jié) -- 計(jì)算方法執(zhí)行時(shí)間

    摘要:什么是字節(jié)碼程序通過編譯之后生成文件就是字節(jié)碼集合正是有這樣一種中間碼字節(jié)碼,使得等函數(shù)語(yǔ)言只用實(shí)現(xiàn)一個(gè)編譯器即可運(yùn)行在上。 什么是字節(jié)碼? java程序通過javac編譯之后生成文件.class就是字節(jié)碼集合,正是有這樣一種中間碼(字節(jié)碼),使得scala/groovy/clojure等函數(shù)語(yǔ)言只用實(shí)現(xiàn)一個(gè)編譯器即可運(yùn)行在JVM上。看看一段簡(jiǎn)單代碼。 public long ...

    娣辯孩 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<