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

深入了解JVM字節(jié)碼增強技術

 更新時間:2019年11月02日 16:45:30   作者:loytime  
這篇文章主要介紹了深入了解JVM字節(jié)碼增強技術,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

這篇文章主要介紹了深入了解JVM字節(jié)碼增強技術,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

JVM——字節(jié)碼增強技術簡介

Java字節(jié)碼增強指的是在Java字節(jié)碼生成之后,對其進行修改,增強其功能,這種方式相當于對應用程序的二進制文件進行修改。Java字節(jié)碼增強主要是為了減少冗余代碼,提高性能等。

實現(xiàn)字節(jié)碼增強的主要步驟為:

1、修改字節(jié)碼

在內存中獲取到原來的字節(jié)碼,然后通過一些工具(如 ASM,Javaasist)來修改它的byte[]數(shù)組,得到一個新的byte數(shù)組。

2、使修改后的字節(jié)碼生效

有兩種方法:

1) 自定義ClassLoader來加載修改后的字節(jié)碼;

2)替換掉原來的字節(jié)碼:在JVM加載用戶的Class時,攔截,返回修改后的字節(jié)碼;或者在運行時,使用Instrumentation.redefineClasses方法來替換掉原來的字節(jié)碼;

3. 兩種實現(xiàn)機制:

(1) 通過創(chuàng)建原始類的一個子類(動態(tài)創(chuàng)建的類繼承原來的類)。子類名以原始類名為前綴,以避免重名。Spring AOP 使用的就是這種

(2) 直接修改原始類的字節(jié)碼。類的跟蹤過程中使用

4. 實現(xiàn)字節(jié)碼增強要執(zhí)行兩個步驟:

(1) 在內存中獲取到原始的字節(jié)碼, 然后通過一些開源的API 來修改它的byte[] 數(shù)組,得到一個新的byte[] 數(shù)組。

(2) 將新的byte[] 數(shù)組加載到PermGen 區(qū)(即加載新的byte[] 數(shù)組或替換原始類的字節(jié)碼)。

接口 BCInterface

public interface BCInterface {
  void enhancement();
}

實現(xiàn)類 BCEnhancement.java

public class BCEnhancement implements BCInterface{
  public void enhancement() {
    System.out.println("hello enhancement");
  }
}
 

LogProxy.java

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class LogProxy implements InvocationHandler {
  private Object object;
  public Object getProxyObject(Object o){
    object=o;
    try{
      return Proxy.newProxyInstance(this.getClass().getClassLoader(),o.getClass().getInterfaces(),this);
    }catch (IllegalArgumentException e){
      throw new RuntimeException(e);
    }
  }
  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    System.out.println("before invoke ...");
    Object result= method.invoke(object,args);
    System.out.println("after invoke ...");
    return result;
  }
}

測試類 Test.java

public class Test {
  public static void main(String[] args) {
    LogProxy logProxy = new LogProxy();
    System.setProperty("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");
    BCInterface byteCodeEn = (BCInterface) logProxy.getProxyObject(new BCEnhancement());
    byteCodeEn.enhancement();
  }
}

輸出:

before invoke ...
hello enhancement
after invoke ...

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • fastjson對JSONObject中的指定字段重新賦值的實現(xiàn)

    fastjson對JSONObject中的指定字段重新賦值的實現(xiàn)

    這篇文章主要介紹了fastjson對JSONObject中的指定字段重新賦值的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • Java基于Google zxing生成帶logo的二維碼圖片

    Java基于Google zxing生成帶logo的二維碼圖片

    zxing是一個開放源碼的,用java實現(xiàn)的多種格式的1D/2D條碼圖像處理庫,本文主要介紹了Java基于Google zxing生成帶logo的二維碼圖片,具有一定的參考價值,感興趣的可以了解一下
    2023-10-10
  • Springboot jdbctemplate整合實現(xiàn)步驟解析

    Springboot jdbctemplate整合實現(xiàn)步驟解析

    這篇文章主要介紹了Springboot jdbctemplate整合實現(xiàn)步驟解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-08-08
  • java8新特性之日期時間API

    java8新特性之日期時間API

    這篇文章主要介紹了java8新特性之日期時間API,文中有非常詳細的代碼示例,對正在學習java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • Spring 4 支持的 Java 8 特性

    Spring 4 支持的 Java 8 特性

    Spring 框架 4 支持 Java 8 語言和 API 功能。在本文中,我們將重點放在 Spring 4 支持新的 Java 8 的功能。最重要的是 Lambda 表達式,方法引用,JSR-310的日期和時間,和可重復注釋。下面跟著小編一起來看下吧
    2017-03-03
  • JAVA比較兩張圖片相似度的方法

    JAVA比較兩張圖片相似度的方法

    這篇文章主要介紹了JAVA比較兩張圖片相似度的方法,涉及java針對圖片像素操作的相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • Idea配置超詳細圖文教程(2020.2版本)

    Idea配置超詳細圖文教程(2020.2版本)

    這篇文章主要介紹了Idea配置超詳細圖文教程(2020.2版本),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • springboot controller無效的處理方案

    springboot controller無效的處理方案

    這篇文章主要介紹了springboot controller無效的處理方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Spring?MVC概念+項目創(chuàng)建+@RequestMappring案例代碼

    Spring?MVC概念+項目創(chuàng)建+@RequestMappring案例代碼

    Spring?MVC?是?Spring?提供的一個基于?MVC?設計模式的輕量級?Web?開發(fā)框架,本質上相當于?Servlet,這篇文章主要介紹了Spring?MVC概念+項目創(chuàng)建+@RequestMappring,需要的朋友可以參考下
    2023-02-02
  • MyBatis傳入?yún)?shù)為List對象的實現(xiàn)

    MyBatis傳入?yún)?shù)為List對象的實現(xiàn)

    這篇文章主要介紹了MyBatis傳入?yún)?shù)為List對象的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03

最新評論