91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

深入了解JVM字節碼增強技術

發布時間:2020-10-25 01:50:46 來源:腳本之家 閱讀:139 作者:loytime 欄目:編程語言

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

JVM——字節碼增強技術簡介

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

實現字節碼增強的主要步驟為:

1、修改字節碼

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

2、使修改后的字節碼生效

有兩種方法:

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

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

3. 兩種實現機制:

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

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

4. 實現字節碼增強要執行兩個步驟:

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

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

接口 BCInterface

public interface BCInterface {
  void enhancement();
}

實現類 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 ...

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

江油市| 定州市| 讷河市| 福泉市| 楚雄市| 雷州市| 成都市| 嘉兴市| 盐山县| 海口市| 台北县| 建宁县| 长武县| 东至县| 德阳市| 乌什县| 太仓市| 西峡县| 越西县| 贡嘎县| 乌鲁木齐市| 永春县| 延津县| 灵山县| 湘潭市| 株洲县| 南城县| 濉溪县| 敦化市| 鄂尔多斯市| 许昌县| 慈溪市| 高雄市| 阳谷县| 乡宁县| 荃湾区| 乐昌市| 盖州市| 县级市| 太和县| 绵竹市|