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

作者:loytime 时间:2021-06-04 16:28:13 

这篇文章主要介绍了深入了解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 ...

来源:https://www.cnblogs.com/loytime/p/11749979.html

标签:jvm,字节,码,增强,技术
0
投稿

猜你喜欢

  • Java实现用户管理系统

    2023-08-26 17:18:21
  • 浅谈Java8 判空新写法

    2023-06-21 15:55:08
  • CentOS 7系统下配置自定义JDK的教程

    2022-02-27 13:46:26
  • 浅谈MyBatis3 DynamicSql风格语法使用指南

    2023-11-25 13:05:06
  • Android主线程和子线程区别详解

    2023-12-18 17:33:38
  • JAVA用递归实现全排列算法的示例代码

    2023-06-01 09:09:58
  • Java KindEditor粘贴图片自动上传到服务器功能实现

    2023-08-07 01:42:33
  • Java 获取两个List的交集和差集,以及应用场景操作

    2021-11-21 17:49:43
  • Android 获取判断是否有悬浮窗权限的方法

    2023-11-04 22:48:18
  • Spring Boot 文件上传与下载的示例代码

    2021-08-30 02:04:53
  • 如何基于FTP4J实现FTPS连接过程解析

    2022-09-19 21:51:35
  • 浅谈@Value和@Bean的执行顺序问题

    2023-02-25 18:30:24
  • Android项目实战手把手教你画圆形水波纹loadingview

    2023-03-15 10:13:47
  • Java8新特性:函数式编程

    2021-12-01 03:09:02
  • Android开发使用Drawable绘制圆角与圆形图案功能示例

    2023-08-26 21:07:09
  • Android10 启动之SystemServer源码分析

    2021-08-15 05:38:13
  • java实现小i机器人api接口调用示例

    2023-02-05 00:09:15
  • C++ 实现球迷 今日头条面试题

    2022-07-08 11:03:24
  • Windows7下的Java运行环境搭建过程图解

    2022-03-14 19:40:59
  • java 可变参数详解及实例

    2021-06-01 10:02:42
  • asp之家 软件编程 m.aspxhome.com