字节码增强

之前看了美团技术团队推送的一篇文章,介绍了字节码增强技术,可的很好,自己也记录一下,增强一下记忆,也方便日后巩固学习,有兴趣的可以去搜索美团技术团队的原文

字节码是JVM的底层基础知识,如果能够掌握对于排查问题会有更深层次的理解

1.什么是字节码

首先我们看看什么是字节码,找到一个.class文件,看看长什么样子

Java之所以可以一次编译,到处运行,首先是因为JVM针对各种操作系统和平台都进行了定制,二是无论在什么平台,都可以通过javac命令将一个.java文件编译成固定格式的字节码(.class文件)供JVM使用

之所以被称之为字节码,是因为.class文件是由十六进制值组成的,JVM以两个十六进制值为一组,就是以字节为单位进行读取

2.字节码的结构

.java文件编译后生成的字节码文件,打开如上图,JVM对字节码是有规范要求的,要求每一个字节码文件都要有十部分按照固定的顺序组成,整体的结构和顺序如下图:

(1)魔数

所有的.class文件的前4个字节都是魔数,魔数以一个固定值:0xCAFEBABE,放在文件的开头,JVM就可以根据这个文件的开头来判断这个文件是否可能是一个.class文件,如果是这个开头,才会往后执行下面的操作

一直困惑的java的图标为什么是一杯咖啡,看到这里就大概明白了,这个魔数的固定值是Java之父James Gosling指定的,意为CafeBabe(咖啡宝贝)

原文地址:https://www.cnblogs.com/wangflower/p/12238619.html

时间: 2024-10-01 03:17:30

字节码增强的相关文章

JVM——字节码增强技术简介

Java字节码增强指的是在Java字节码生成之后,对其进行修改,增强其功能,这种方式相当于对应用程序的二进制文件进行修改.Java字节码增强主要是为了减少冗余代码,提高性能等. 实现字节码增强的主要步骤为: 1.修改字节码 在内存中获取到原来的字节码,然后通过一些工具(如 ASM,Javaasist)来修改它的byte[]数组,得到一个新的byte数组. 2.使修改后的字节码生效 有两种方法: 1) 自定义ClassLoader来加载修改后的字节码: 2)替换掉原来的字节码:在JVM加载用户的C

修改原有的方法名称(字节码增强)

通常对一个方法增加日志记录,安全检查都会说采用AOP或CGLIB动态代理,但无论哪种方式都必需改变原有的调用方式:同时,大量的反射调用也必增加系统的开销.下面介绍一种不需要改变客户端调用方式而又能实现对指定方法增加缓存或日志的方式,那就是——字节码增强! 在实际项目中通常需要对一些频繁访问数据库的方法采用对象缓存,从而提高系统性能减少不必要的网络开销.这时候一般我们会去修改方法的源码,增加Cache的put,get调用,要么采用AspectJ或cglib进行方法执行前或执行后的拦截 但采用无论采

字节码增强技术探索

1.字节码 1.1 什么是字节码? Java之所以可以“一次编译,到处运行”,一是因为JVM针对各种操作系统.平台都进行了定制,二是因为无论在什么平台,都可以编译生成固定格式的字节码(.class文件)供JVM使用.因此,也可以看出字节码对于Java生态的重要性.之所以被称之为字节码,是因为字节码文件由十六进制值组成,而JVM以两个十六进制值为一组,即以字节为单位进行读取.在Java中一般是用javac命令编译源代码为字节码文件,一个.java文件从编译到运行的示例如图1所示. 图1 Java运

javaAgent和Java字节码增强技术的学习与实践

参考文章: https://www.cnblogs.com/chiangchou/p/javassist.html https://blog.csdn.net/u010039929/article/details/62881743 https://www.jianshu.com/p/0f64779cdcea [本文代码下载] 下载代码 [背景] 最近在工作中进行程序的性能调优时,想起之前同事的介绍的阿里的Java在线诊断工具 —— arthas,决定试用一下. 这玩意,是真的好用,能在对被检测程

JVM字节码增强

JVM——字节码增强技术简介 Java字节码增强指的是在Java字节码生成之后,对其进行修改,增强其功能,这种方式相当于对应用程序的二进制文件进行修改.Java字节码增强主要是为了减少冗余代码,提高性能等. 实现字节码增强的主要步骤为: 1.修改字节码 在内存中获取到原来的字节码,然后通过一些工具(如 ASM,Javaasist)来修改它的byte[]数组,得到一个新的byte数组. 2.使修改后的字节码生效 有两种方法: 1) 自定义ClassLoader来加载修改后的字节码: 2)替换掉原来

逆水行舟 —— jdk动态代理和Cglib字节码增强

JDK动态代理 利用拦截器加上反射机制生成一个实现代理接口的匿名类,在调用具体方法时,调用InvocationHandler来处理 JDK动态代理只需要JDK环境就可以进行代理,流程为: 实现InvocationHandler 使用Proxy.newProxyInstance产生代理对象 被代理的对象必须实现接口 具体列子如下: public class UserServiceImpl implements UserService { @Override public void eat() {

Javassist字节码增强示例

概述 Javassist是一款字节码编辑工具,可以直接编辑和生成Java生成的字节码,以达到对.class文件进行动态修改的效果.熟练使用这套工具,可以让Java编程更接近与动态语言编程. 下面一个方法的目的是获取一个类加载器(ClassLoader),以加载指定的.jar或.class文件,在之后的代码中会使用到. [java] view plaincopy private static ClassLoader getLocaleClassLoader() throws Exception {

Jpa/Hibernate 字节码增强:字段延迟加载

JPA提供了@Basic注解,实现延迟加载字段的功能,如下: @Basic(fetch = FetchType.LAZY) @Column(name = "REMARK_CONTENT" ) private String remarkContent; 但是实际上延迟加是不是起作用的,依然能够出这个字段的数据. 为了延迟加载生效,需要使用字节码增加的插件: 在pom文件中配置: <plugin> <groupId>org.hibernate.orm.tooling

Java协程框架-Kilim字节码剖析

前面几篇文章从代码层面介绍了Kilim的基本原理,但是对于其中的一些细节,比如Task的执行状态如何管理等问题从代码上依然得不到答案,本文即再深入到字节码层面来解答. 1.  Kilim字节码改写前后的代码有什么区别? 这里还是先上Kilim官方文档中的一张图,这张图清晰的展现出原始的代码与经Kilim改写后的协程代码. 可以看出左边的原始代码,与我们常见的函数相比有所不同,这里显示声明抛出Pausable异常.实际上这个异常在运行期间不会抛出,它的实际作用类似于注解,使得Kilim能够识别哪些