成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

U2FsdGVkX1x / 3584人閱讀

摘要:因此,若想對對象進(jìn)行修改,必須對其進(jìn)行解凍,通過方法進(jìn)行生成一個(gè)方法生成一個(gè)方法通過反射調(diào)用生成的方法方法體前面和后面加執(zhí)行語句方法體前面通過反射調(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é)碼操作]

參考文章: 傳送

操作示例:

public @interface Author {
  String name();
  int year();
}
@Author(name = "gs",year=2015)
public class Emp {
  private int num;
  private String name;
  
  public Emp() {
  }
  
  public Emp(int num, String name) {
   this();
   this.num = num;
   this.name = name;
  }
  
  public void sayHello(String name){
   System.out.print("你好,");
  }
  public int getNum() {
   return num;
  }
  public void setNum(int num) {
   this.num = num;
  }
  public String getName() {
   return name;
  }
  public void setName(String name) {
   this.name = name;
  }
  
}
 
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Arrays;
 
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtConstructor;
import javassist.CtField;
import javassist.CtMethod;
import javassist.CtNewMethod;
import javassist.NotFoundException;
 
/**
 * 測試 javassist 的 API
 *
 * @author Administrator
 *
 */
public class Test11 {
 
  // 通過類名加載已有的類
  public static void test1(ClassPool pool, CtClass cc) {
 
    try {
     cc = pool.get("com.gs.Emp");
 
     byte[] bytes = cc.toBytecode(); // 轉(zhuǎn)化為字節(jié)碼
     System.out.println(Arrays.toString(bytes));
 
     System.out.println(cc.getName()); // 獲取類名
     System.out.println(cc.getSimpleName());
     System.out.println(cc.getSuperclass()); // 獲取父類
     System.out.println(cc.getInterfaces()); // 獲取接口
     
    } catch (Exception e) {
     e.printStackTrace();
    }
 
  }
 
  // 動(dòng)態(tài)生成一個(gè)方法,并調(diào)用
  public static void test2(ClassPool pool, CtClass cc) {
 
    try {
     /*當(dāng)CtClass對象通過writeFile()、toClass()、toBytecode()轉(zhuǎn)化為Class后,
      * Javassist凍結(jié)了CtClass對象,因此,JVM不允許再次加載Class文件,所以不允許對其修改。
     因此,若想對CtClass對象進(jìn)行修改,必須對其進(jìn)行解凍,通過defrost()方法進(jìn)行*/
     cc.defrost();
     // 生成一個(gè)方法
     CtMethod add = CtNewMethod.make("public int add(int a,int b){return $1+$2;}", cc);
     // 生成一個(gè)方法
     CtMethod subtraction = new CtMethod(CtClass.intType, "subtraction",
         new CtClass[] { CtClass.intType, CtClass.intType }, cc);
     subtraction.setModifiers(Modifier.PUBLIC);
     subtraction.setBody("return $1-$2;");
 
     cc.addMethod(add);
     cc.addMethod(subtraction);
 
     // 通過反射調(diào)用生成的方法
     Class clazz = cc.toClass();
     Emp emp = (Emp) clazz.newInstance();
     // Method method = clazz.getDeclaredMethod("add", new
     // Class[]{int.class,int.class});
     Method method = clazz.getDeclaredMethod("subtraction", new Class[] { int.class, int.class });
     Object result = method.invoke(emp, 200, 300);
     System.out.println(result);
    } catch (Exception e) {
    }
  }
 
  // 方法體前面和后面加執(zhí)行語句
  public static void test3(ClassPool pool, CtClass cc) {
 
    try {
     cc.defrost();
     CtMethod m1 = cc.getDeclaredMethod("sayHello", new CtClass[] { pool.get("java.lang.String") });
     m1.insertBefore("System.out.println("方法體前面");");
     m1.insertAfter("System.out.println($1);");
 
     // 通過反射調(diào)用生成的方法
     Class clazz = cc.toClass();
     Emp emp = (Emp) clazz.newInstance();
     Method method = clazz.getDeclaredMethod("sayHello", new Class[] { String.class });
     method.invoke(emp, "張三");
 
    } catch (Exception e) {
     e.printStackTrace();
    }
 
  }
 
  // 生成屬性和方法
  public static void test4(ClassPool pool, CtClass cc) {
    try {
     // CtField.make("private double salary;", cc);
     CtField field = new CtField(CtClass.doubleType, "salary", cc);
     field.setModifiers(Modifier.PRIVATE);
     cc.addField(field);
 
     // cc.getDeclaredField("salary"); //獲取屬性
 
     CtMethod method = CtNewMethod.getter("getSalary", field);
     cc.addMethod(method);
 
     CtMethod method2 = CtNewMethod.getter("setSalary", field);
     cc.addMethod(method2);
    } catch (Exception e) {
     e.printStackTrace();
    }
 
  }
 
  // 生成構(gòu)造器
  public static void test5(ClassPool pool, CtClass cc) {
 
    try {
     cc.defrost();
     CtConstructor[] cs = cc.getConstructors();
     for (CtConstructor c : cs) {
       System.out.println(c.getLongName());
       c.insertAfter("System.out.println("可以在構(gòu)造器前后加代碼");");
     }
    } catch (Exception e) {
     e.printStackTrace();
    }
 
  }
 
  // 注解操作
  public static void test6(ClassPool pool, CtClass cc) {
    try {
     cc.defrost();
     Object[] annotations = cc.getAnnotations();
     Author author = (Author) annotations[0];
     System.out.println("name:" + author.name() + ",year:" + author.year());
 
    } catch (Exception e) {
     e.printStackTrace();
    }
  }
 
  public static void main(String[] args) {
    ClassPool pool = ClassPool.getDefault();
    CtClass cc = null;
    try {
     cc = pool.get("com.gs.Emp");
    } catch (NotFoundException e) {
     e.printStackTrace();
    }
 
    test1(pool, cc);
    //test2(pool, cc);
    test3(pool, cc);
    test5(pool, cc);
    test6(pool, cc);
  }
}

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

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/71625.html

相關(guān)文章

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

    摘要:知識(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é)碼操作類庫,這是的項(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é)...

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

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

    趙連江 評論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)勢比反射開銷小性能高性能高于反射低于常見的字節(jié)碼操作類庫這是的項(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 評論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 評論0 收藏0
  • java retry(重試) spring retry, guava retrying 詳解

    摘要:支持重試版本思考小明我手頭還有其他任務(wù),這個(gè)也挺簡單的。與其他類似的字節(jié)碼編輯器不同,提供了兩個(gè)級(jí)別的源級(jí)和字節(jié)碼級(jí)。另一方面,字節(jié)碼級(jí)允許用戶直接編輯類文件作為其他編輯器。提供與其他字節(jié)碼框架類似的功能,但主要關(guān)注性能。 系列說明 java retry 的一步步實(shí)現(xiàn)機(jī)制。 java-retry 源碼地址 情景導(dǎo)入 簡單的需求 產(chǎn)品經(jīng)理:實(shí)現(xiàn)一個(gè)按條件,查詢用戶信息的服務(wù)。 小明:好的...

    LucasTwilight 評論0 收藏0

發(fā)表評論

0條評論

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