温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

怎么深入了解JVM字节码增强技术

发布时间:2021-10-23 17:19:56 来源:亿速云 阅读:101 作者:柒染 栏目:编程语言

这期内容当中小编将会给大家带来有关怎么深入了解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 enhancementafter invoke ...

上述就是小编为大家分享的怎么深入了解JVM字节码增强技术了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

jvm
AI