首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java 字节码操作示例

Java 动态性的两种常见实现方式 (1)字节码操作 (2)反射 运行时操作字节码可以让我们实现如下功能: (1)动态生成新的类 (2)动态改变某个类的结构(添加/删除/修改 新的属性/方法...BCEL 与Javassist 有不同的处理字节码的方法,BCEL 在实际的 JVM 指令层次上进行操作 ( BCEL 拥有丰富的 JVM指令级支持 ),而 Javaassist 所强调的是源代码级别的工作...ASM 是一个轻量级 Java 字节码操作框架,直接涉及到 JVM 底层的操作和指令 前两个效率最高,学起来也较难 CGLIB(Code Generation Library) 是一个强大的...Javassist 是一个开源的分析、编辑和创建 Java 字节码的类库。性能较 ASM 差,跟 cglib 差不多,但是使用简单。很多开源框架都在使用它。...这就是我们生成的字节码文件内容。

89010

Java 字节码操作框架——ASM

大家好我是小悦,之前的文章我们介绍了字节码的基础知识,今天我们将介绍字节码相关的应用场景,首先要介绍的是如何对字节码做解析和修改,本文将会详细给大家介绍一个工业级字节码操作框架 ASM。...ASM 当我们需要对一个 class 文件做修改时,我们可以选择自己解析这个class 文件,在符合 Java 字节码规范的前提下进行字节码改造。...,例如 cglib,、mybatis、fastjson 其它字节码操作框架在操作字节码的过程中生成大量的中间类和对象,耗费大量的内存且运行缓慢,ASM 使用了访问者(Visitor)设计模式,避免了创建和消耗大量的中间变量...ASM 操作字节码案例 接下面我们用几个简单的例子来演示 ASM 各个核心类操作字节码的案例。...小结 这篇文章我们主要讲解了 ASM 字节码操作框架,一起来回顾一下要点: 第一,ASM 是一个久经考验的工业级字节码操作框架。

42020
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Java Agent(三)、ASM 操作字节码入门

    而今天将要介绍另一种能操作Java字节码的技术,也就是ASM。他相比Javassist更灵活,提供了更细粒度的控制。 2、什么是ASM? ASM是一个通用的 Java 字节码操作和分析框架。...ASM 提供了一些常见的字节码转换和分析算法,可从中构建自定义复杂转换和代码分析工具。ASM 提供与其他 Java 字节码框架类似的功能,但更注重性能。...MethodVisitor 和 FieldVisitor 分别用于处理方法和字段相关的字节码信息。 字节码流解析: ClassReader 会把 class 文件的内容解析成一系列的字节码指令流。...accept(ClassVisitor visitor, int flags):将类的字节码委托给ClassVisitior进行访问和处理,其中flags参数有: ClassReader.EXPAND_FRAMES...Javassist:基于高层级的 API,提供类似 Java 源代码的操作方式,无需直接理解和操作字节码指令。更加高抽象,适合快速开发动态字节码功能,易于理解和使用。

    19720

    3种骚操作,教你查看 Java 字节码!

    在我们工作、学习、以及研究 JVM 过程当中,不可避免的要查看 Java 字节码,通过查看字节码可以了解一个类的编译结果,也能通过编译器层面来分析一个类的性能。...字节码文件是不能直接打开的,下面栈长教大家几种简单的方法如何查看 Java 字节码。...1、使用 javap 命令查看字节码 命令格式如下: javap -c xxx.class JDK 提供的了,不解释,来,演示操作一把: $ javap -c Test.class Compiled from...3、Eclipse 中查看字节码 在 Eclipse 中查看字节码稍显麻烦,需要安装插件,并打开插件窗口,安装和使用方式如下: Name: bytecode Location: http://andrei.gmxhome.de...Eclipse 打开 ByteCode 插件窗口: Window-> Show View -> Other -> Java -> Bytecode 如图所示,可以看到 String 类的的字节码。

    1.1K21

    Java字节码 顶

    Java字节码对于虚拟机,就好像汇编语言对于计算机,属于基本执行指令。每一个Java字节码指令是一个byte数字,并且有一个对应的助记符。...Java虚拟机常用指令 常量入栈指令 常量入栈指令的功能是将常数压入操作数栈,根据数据类型和入栈内容的不同,又可以分为const系列、push系列和ldc指令。...这种处理方式有两个特点 一方面可以减少实际的数据类型,如果为short和byte都准备一套指令,那么指令的数量就会大增,而虚拟机目前的设计上,只愿意使用一个字节表示指令,因此指令总数不能超过256个,为了节省指令资源...,将short和byte当成int处理。...对象/数组操作指令 Java是面向对象的程序设计语言,虚拟机平台从字节码层面就对面向对象做了深层次的支持。

    80720

    Java字节码简介

    中,而jvm要运行java代码首先要做的就是加载字节码,也就是.java文件经过编译变成的.class文件。...jvm运行的指令就是.class字节码。所以通过学习字节码的规范和规则能提升我们对代码执行过程的理解。 这里恶补一下字节码相关的基础知识。 我们打开.class文件,发现字节码都是十六进制的编码。...2.版本号:因为java有不同的版本,所以在java字节码中也有标记。0000 0034两个字节就表示java1.8版本。..." 总结:java通过编译将源文件编译为字节码文件,其字节码中方法的执行和常量池和代码区有很大的联系。...其中代码区包括指令区、本地变量表操作数栈等。代码的运行通过操作数栈进行相关的逻辑操作,本地变量表用来定义局部变量和执行结果缓存,代码运行需要的用到的常量则直接从常量池中获取。

    1.1K10

    Android必备:ASM字节码操作

    ASM全称为“Java字节码操作框架(Java Bytecode Manipulation Framework)”,它是一个用于生成和转换Java字节码的框架。...它可以让你在运行时动态地生成、修改和转换Java字节码,可以做到诸如在类加载时动态修改字节码,或者在执行过程中动态生成新的类等等。...首先,反射是在已有的类上进行操作,而ASM可以动态生成新的类或者修改已有的类。这就意味着ASM在某些情况下可以比反射更加灵活和强大。 其次,ASM操作的是字节码,而反射操作的是类的元数据。...ASM的使用场景 ASM可以用在很多场景中,比如: 代码注入 AOP(面向切面编程) 动态代理 字节码加密和混淆 动态生成类和方法 除此之外,ASM还可以用来做性能优化。...使用ASM进行字节码加密和混淆 使用ASM可以对字节码进行加密和混淆,增强代码的安全性。可以通过修改常量池、修改方法名和字段名等方式来达到加密和混淆的效果。

    73721

    Java字节码增强探秘

    本文重点着眼于字节码增强技术,从字节码开始逐层向上,由JVM字节码操作集合到Java中操作字节码的框架,再到我们熟悉的各类框架原理及应用,也都会一一进行介绍。...1.3 字节码操作集合 在上图13中,Code区的红色编号0~17,就是.java中的方法源代码编译后让JVM真正执行的操作码。...1.4 操作数栈和字节码 JVM的指令集是基于栈而不是寄存器,基于栈可以具备很好的跨平台性(因为寄存器指令集往往和硬件挂钩),但缺点在于,要完成同样的操作,基于栈的实现需要更多指令才能完成(因为栈只是一个...Visit以及修改;另一个是Generator类,在这个类中定义ClassReader和ClassWriter,其中的逻辑是,classReader读取字节码,然后交给MyClassVisitor类处理...,处理完成后由ClassWriter写字节码并将旧的字节码替换掉。

    1.9K51

    Java 动态字节码技术

    随着对 Java 的愈加熟悉,我也了解了反射、字节码等技术,直到前些天的周会分享,有位同事分享了 Btrace 的使用和实现,提到了 Java 的 ASM 框架和 JVM TI 接口。...动态生成字节码 我们知道,我们编写的 Java 代码都是要被编译成字节码后才能放到 JVM 里执行的,而字节码一旦被加载到虚拟机中,就可以被解释执行。...对照着示例,我们就可以很轻松地写出操作字节码的 Java 代码了。 而切到 ASMified 标签栏,我们甚至可以直接获取到 ASM 的使用代码。 ?...常用方法 在 ASM 的代码实现里,最明显的就是访问者模式,ASM 将对代码的读取和操作都包装成一个访问者,在解析 JVM 加载到的字节码时调用。...; } } } 执行字节码修改和转换的类。

    2K20

    Java字节码增强探秘

    本文重点着眼于字节码增强技术,从字节码开始逐层向上,由JVM字节码操作集合到Java中操作字节码的框架,再到我们熟悉的各类框架原理及应用,也都会一一进行介绍。...1.3 字节码操作集合 在上图13中,Code区的红色编号0~17,就是.java中的方法源代码编译后让JVM真正执行的操作码。...1.4 操作数栈和字节码 JVM的指令集是基于栈而不是寄存器,基于栈可以具备很好的跨平台性(因为寄存器指令集往往和硬件挂钩),但缺点在于,要完成同样的操作,基于栈的实现需要更多指令才能完成(因为栈只是一个...Visit以及修改;另一个是Generator类,在这个类中定义ClassReader和ClassWriter,其中的逻辑是,classReader读取字节码,然后交给MyClassVisitor类处理...,处理完成后由ClassWriter写字节码并将旧的字节码替换掉。

    1K20

    Java 字节流操作

    在java中我们使用输入流来向一个字节序列对象中写入,使用输出流来向输出其内容。C语言中只使用一个File包处理一切文件操作,而在java中却有着60多种流类型,构成了整个流家族。...而我准备将其按照处理文件类型的不同,分为字节流类型和字符流类型。共两篇文章,本篇从字节流开始。...这是一个受查异常,具体的调用者必须处理异常。除了一次读取一个字节,InputStream中还提供了read(byte[]),读取多个字节。...一样,内部依然封装了字节数组buf和实际容量count,通过构造方法可以指定内置字节数组的长度。...DataInputStream完成的就是读取的操作,基本和DataOutputStream 的操作是类似的,是一个逆操作。

    1.3K90

    Java字节码与反射机制

    字节码(Byte Code)是Java语言跨平台特性的重要保障,也是反射机制的重要基础。...通过反射机制,我们不仅能看到一个类的属性和方法,还能在一个类里调用另外一个类的方法,但前提是我们得有相关类的字节码文件(也就是.class文件)。...1 字节码和.class文件 当我们编写好以.java为扩展名的文件后,如果它能被运行(比如其中包含main函数),那么我们能通过点击MyEclipse里的运行按钮运行这个.java文件。...但此时,MyEclipse向我们隐藏了一个关键步骤:它首先是把.java文件编译成扩展名是.class的字节码文件,随后,Java的虚拟机(JVM)是在当前的操作系统上(比如window 10)上运行这个...有些偏题了,回到反射这个话题上,只要我们能得到.class这个字节码文件,那么通过反射机制我们不仅能看到这个.class所对应java文件里的属性方法等信息,而且还能调用它所对应java文件里的方法。

    75110

    Java字节码深度知多少?

    Java真的是长盛不衰,拥有顽强的生命力。其中,字节码机制功不可没。字节码,就像是 Linux 的 ELF。有了它,JVM直接摇身一变,变成了类似操作系统的东西。...这部分内容枯燥乏味,关于它的细节在Java的官方都能非常容易的找到。 如下图,展示了一个简单方法的字节码描述,我们可以看到真正的执行指令在整个文件结构中的具体位置。...使用实例对象直接调用,和强制转化成接口调用,所调用的字节码指令分别是 invokevirtual 和invokeinterface,它们是不同的。...但是我们可以使用一些外部的字节码修改工具,比如ASM,来生成一些带有这个指令的字节码,这通常能够完成一些非常酷的功能,比如完成一门弱类型检查的JVM-Base语言。...END 本文从Java字节码的顶层结构介绍开始,通过一个实际代码,了解了类加载以后,在JVM内存里的表现形式,并了解了jhsdb对Java进程的观测方式。

    7410

    java字节码byte code简介

    简介 Byte Code也叫做字节码,是连接java源代码和JVM的桥梁,源代码编译成为字节码,而字节码又被加载进JVM中运行。...字节码怎么生成,怎么查看字节码,隐藏在Byte Code背后的秘密是什么呢?快跟小师妹一起来看看吧。 Byte Code的作用 小师妹:F师兄,为什么Java需要字节码呢?...一般来说Java processor不会实现全部的字节码中的功能,只会提供部分的实现。 查看Byte Code字节码 小师妹:F师兄,那使用javac编译过后的class文件跟字节码有什么关系呢?...我们再回顾一下上面的testByteCode的字节码。里面有很多iconst,istore的东西,这些东西被称作Opcode,也就是一些基于栈的操作指令。...上面讲了java bytecode的操作指令其实有很多个。下面我们列出这些指令的部分介绍: ? 实在是太多了,这里就不把所有的列出来了。

    1.4K31

    Java 类机制(4)---- 字节码和方法执行

    动态链接 方法返回地址 字节码 前言 ​ 大家好,不知不觉已经到 9 月份了,本篇文章是 Java 类机制的最后一篇,我们来一起探讨一下关于 Java 的字节码和方法调用。...max_stack:方法的操作数栈的最大深度值,Java 方法在 JVM 中执行时采用的是栈模型,在执行字节码时会从栈中取出对应的操作数,并将操作结果(如果有并且需要的话)压回操作数栈中,这样的话整个...Java 方法执行的过程就是不断的对这个操作数栈进行入栈和出栈的过程,因此就一定会有一个操作数栈中元素最多的节点,而在这个节点的操作数栈的元素数量即为 max_stack 的值。...StackMapTable 存储了一些类型信息,用于提供数据给 Type Checker 检查和处理目标方法的局部变量和操作数栈所需要的数据类型是否匹配。...字节码 我们再之前已经多次接触过了字节码了,也知道了字节码的概念和意义,这里给出 Java 虚拟机字节码指令对照表以供使用时参考:字节码指令对照。

    54320

    从java文件到字节码

    本文来说一下,我们开发好的.java文件是源码文件,并不能交给机器直接执行,需要将其变成字节码甚至是机器码文件。那么静态编译器是如何把源码转化成字节码的呢? 下图为.java源码转化为字节码的过程。...词法解析就是通过空格分隔出单词、操作符、控制符等信息,将其形成token信息流,传递给语法解析器;在语法解析时,把词法解析得到的token信息流按照Java语法规则组装成一个语法树。...当语义分析完成之后,即可以生成字节码。 字节码必须通过类加载过程加载到JVM环境中后,才可以执行。...字节码执行的三种模式 解释执行 JIT编译执行 JIT编译与解释混合执行(主流JVM默认模式) 何为JIT编译?...JIT的作用就是将Java字节码动态低编译成可以直接发送给处理器指令执行的机器码。大致流程如下: ? 注意:解释执行与编译执行在线上环境微妙的辩证关系。

    98420
    领券