深入了解JVM字节码增强技术
2019-11-03 07:04
1346 查看
这篇文章主要介绍了深入了解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 ...
以上就是本文的全部内容,希望对大家的学习有所帮助
您可能感兴趣的文章:
相关文章推荐
- 深入了解MySQL 5.5分区功能增强
- 09_深入了解各种布局技术
- 深入了解 Dojo 的服务器推送技术
- Spring IOC中java反射技术的深入了解
- 深入了解当前ETL中用到的一些基本技术
- 深入了解 cometd的服务器推送技术
- (九)8天快速掌握Android视频教程_深入了解各种布局技术
- 深入了解OpenOffice.org(二)-- OpenOffice.org技术架构
- 深入了解各种布局技术
- 深入了解MySQL 5.5分区功能增强
- 【Maclean Liu技术分 享】深入了解Oracle ASM(一)基础概念
- 深入了解 Dojo 的服务器推送技术
- 待深入了解的技术记录
- Android学习笔记---09_深入了解各种布局技术
- 03 深入了解Java集合之增强for循环
- android第六步深入了解各种布局技术
- 9月份以前还是深入了解各个技术原理吧
- 【深入了解】MD4-MD5-SHA哈希密码算法与破解技术
- Unity3D技术之深入了解光照贴图详解