当使用ASM编写的时候 很多情况下需要了解JVM底层的指令的, 并且需要对栈和本地变量显式的进行操作, 如果直接用ASM进行开发势必会付出更多的学习成本和时间成本,并且不易后期的维护。
此框架正好缓解了上述问题。是程序员编写字节码的时候更易于理解和开发,屏蔽了JVM指令以及栈和本地变量的操作,开发的时候更趋近与直接编写java程序。
AsmSupport缺陷还真多,本来打算用于TalkingBird的直接本地代码执行引擎的开发,没想到AsmSupport存在动态绑定的缺陷,通过修正AsmSupport底层实现解决动态绑定,结果又出现栈溢出。甚是让人奔溃。 怎么解决动态绑定的问题呢? 首先我们要搞清楚如下代码是否是合理的: import java.io.Serializable; import org.junit.Test;
ASMSupport是基于ASM实现的一套框架。 ASMSupport通过将ASM字节码操作抽象成对象记作Operator,然后将字节码操作所需要的信息封装到Operator中,并将Operator添加到执行队列Queue中,当方法所需要的所有操作都创建完毕则使用ASM框架将队列中的所有Operator执行。下面列举一个HelloWorld?例子: public static void main(
使用实例 HelloWorld package com.woate.learn; import org.objectweb.asm.Opcodes; import cn.wensiqun.asmsupport.block.method.common.StaticMethodBody; import cn.wensiqun.asmsupport.clazz.AClass; import cn.w
条件判断 If-then判断 /** * If-then判断 */ @Test public void testIfThen() { ClassCreator creator = new ClassCreator(Opcodes.V1_5, Opcodes.ACC_PUBLIC, "generated.crea
ASMSupport系列教程实例下载地址 http://www.wensiqun.com/download/118/
在上一篇文章中我们介绍了如何生成接口,这次我们将编写如何生成一个Class,首先我们先看下面的代码: public class CreateClassExample { private static String staticGlobalVariable = "I'm a static global variable at class"; public int globalVa
ASMSupport A java class byte code operate framework The asmsupport is a java class byte code operate library, it make easier to write or modify a class at runtime. This framework developed base on asm
生成类 生成一个无任何成员方法,变量,无继承,无实现的类。 /** * 生成一个无任何成员方法,变量,无继承,无实现的类。 */ @Test public void testCreateBlankClass(){ ClassCreator creator = new ClassCreator(Op
问题内容: 我正在寻找一个带有直观API的维护良好的Java字节码操作库。那里似乎有很多人。有什么建议可以尝试吗? 问题答案: 对您问题的最佳答案将取决于您的特定需求和目标;如果您可以扩展自己要完成的工作,那么我也许可以提供更针对性的答复。 取而代之的是,以我的经验,ASM可能提供了成熟度,灵活性和易用性的最佳组合: 它的开发相对活跃:即使最新版本是2009年6月,开发人员仍会定期对其VCS进行提
本文向大家介绍Javassist如何操作Java 字节码,包括了Javassist如何操作Java 字节码的使用技巧和注意事项,需要的朋友参考一下 一、开篇 说起 AOP 小伙伴们肯定很熟悉,无论是 JDK 动态代理或者是 CGLIB 等,其底层都是通过操作 Java 字节码来实现代理。常用的一些操作字节码的技术有 ASM、AspectJ、Javassist 等。 ASM 其设计和实现是尽可能小而
正如文件所说: 公共接口操作码 定义JVM操作码、访问标志和数组类型代码。此接口没有定义所有JVM操作码,因为某些操作码会自动处理。例如,xLOAD和xSTORE操作码会在可能的情况下自动替换为xLOAD_n和xSTORE_n操作码。因此,xLOAD_n和xSTORE_n操作码不会在此接口中定义。LDC也是如此,必要时自动替换为LDC_W或LDC2_W、WIDE、GOTO_W和JSR_W。 问题:
我想读取一个二进制文件,并对每个字节做一些操作。我想测试我是否正确地操作了字节。我想将一个字节variable1设置为“00000000”,然后将另一个字节variable2设置为“00001111”,或者它们是newvariable=variable1variable2,将newvariable<<4位,然后打印出int值。
我必须将注释XmlElementWrapper和XmlElement添加到列表类型的字段,但是这些注释需要名称。我想把属性名设置为字段名。我愿意: 这是我的拦截器: 这是目标类的一部分: 但我有一个例外: [public static void factory.framework.SetterListInterceptor.getter(java.lang.reflect.Method)、publ
问题内容: 使用诸如或的库,是否有一种方法可以在设置了类字段的值时将字节码指令添加到类中以执行代码? 例如,假设我有此类: 假设一段代码包含此行: 我希望此指令被拦截,因此将标志设置为。我知道这对于setter方法是可能的-因为可以通过字节码操作来修改类方法,但是我想对 字段 做同样的事情。 这可能吗?如果可以, 怎么 办? 编辑 我想避免修改访问该类的代码部分,我正在寻找一种方法来将拦截代码保留
问题内容: 我遇到了一些有关JVM / JIT活动的参考,其中似乎在编译字节码和解释字节码之间有区别。该特定注释声明的字节码在前10000次运行时进行解释,然后进行编译。 “编译”和“解释”字节码之间有什么区别? 问题答案: 解释字节码基本上是逐行读取字节码,不进行任何优化或任何操作,然后对其进行解析并实时执行。由于许多原因,这种方法效率低下,其中包括Java字节码设计得不能快速解释的问题。 编译
除了基本的读写操作, ByteBuf 还提供了它所包含的数据的修改方法。 随机访问索引 ByteBuf 使用zero-based 的 indexing(从0开始的索引),第一个字节的索引是 0,最后一个字节的索引是 ByteBuf 的 capacity - 1,下面代码是遍历 ByteBuf 的所有字节: Listing 5.6 Access data ByteBuf buffer = ...;