真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

怎么深入了解JVM字節(jié)碼增強(qiáng)技術(shù)

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)碛嘘P(guān)怎么深入了解JVM字節(jié)碼增強(qiáng)技術(shù),文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

成都創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、清遠(yuǎn)網(wǎng)絡(luò)推廣、小程序設(shè)計(jì)、清遠(yuǎn)網(wǎng)絡(luò)營銷、清遠(yuǎn)企業(yè)策劃、清遠(yuǎn)品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);成都創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供清遠(yuǎn)建站搭建服務(wù),24小時(shí)服務(wù)熱線:18982081108,官方網(wǎng)址:www.cdcxhl.com

JVM——字節(jié)碼增強(qiáng)技術(shù)簡介

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

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

1、修改字節(jié)碼

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

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

有兩種方法:

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

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

3. 兩種實(shí)現(xiàn)機(jī)制:

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

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

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

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

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

接口 BCInterface

public interface BCInterface {  void enhancement();}

實(shí)現(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 enhancementafter invoke ...

上述就是小編為大家分享的怎么深入了解JVM字節(jié)碼增強(qiáng)技術(shù)了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


網(wǎng)站標(biāo)題:怎么深入了解JVM字節(jié)碼增強(qiáng)技術(shù)
分享URL:http://weahome.cn/article/ippoce.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部