`
alvinqq
  • 浏览: 180712 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

asm操作Java(二)

    博客分类:
  • java
阅读更多
1.类:
a)数组:
i.创建:
mv.visitInsn(ICONST_3);
mv.visitIntInsn(NEWARRAY, T_INT);
mv.visitVarInsn(ASTORE, 1);      //   将数组引用存到局部变量栈1号的位置


等价于:
int[] a = new int[3];

ii.取值:
mv.visitVarInsn(ALOAD, 1);       //   数组引用在局部变量栈1号的位置
mv.visitInsn(ICONST_1);
mv.visitInsn(IALOAD);
mv.visitVarInsn(ISTORE, 2);


等价于:
int b = a[1];

iii.赋值:
mv.visitVarInsn(ALOAD, 1);
mv.visitInsn(ICONST_1);
mv.visitInsn(ICONST_2);
mv.visitInsn(IASTORE);


等价于:
a[1] = 2;


b)构造函数:
i. <init>:
1.创建:
MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
mv.visitCode();
mv.visitVarInsn(ALOAD, 0);
mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", ()V");
mv.visitInsn(RETURN);
mv.visitMaxs(1, 1);
mv.visitEnd();


说明:构造函数<init>在执行时,需要首先执行父类的构造函数或者类内部其他构造
函数。

2.调用:
mv.visitTypeInsn(NEW, "asm/A");
mv.visitInsn(DUP);
mv.visitMethodInsn(INVOKESPECIAL, "asm/A", "<init>", "()V");
mv.visitVarInsn(ASTORE, 1);


等价于:
A a = new A();


说明:在初始化一般对象时,我们需要先调用NEW指令,来创建该对象实例。而由于
后续的INVOKESPECIAL指令是调用类的构造函数,而该指令执行完以后,对对象的引
用将从栈中弹出,所以在NEW指令执行完以后,INVOKESPECIAL指令执行以前,我们
需要调用DUP指令,来增加对象引用的副本。
ii. <clinit>:
1.创建:
MethodVisitor mv = cw.visitMethod(ACC_STATIC, "<clinit>", "()V", null, null);
mv.visitCode();
mv.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
mv.visitLdcInsn("hello world");
mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V");
mv.visitInsn(RETURN);
mv.visitMaxs(2, 0);
mv.visitEnd();

等价于:
static {
System.out.println("hello world");
}


2. 调用:<clinit>在类被加载时自动调用。
c)字段:
i.一般字段:
1.创建:
FieldVisitor fv = cw.visitField(ACC_PRIVATE, "a", "I", null, null);
fv.visitEnd();


等价于:
private int a;


2.读取:读取类当中名字为a,类型为int的字段的值。
mv.visitVarInsn(ALOAD, 0);
mv.visitFieldInsn(GETFIELD, "asm/A", "a", "I");


3.设置:
mv.visitVarInsn(ALOAD, 0);
mv.visitInsn(ICONST_2);
mv.visitFieldInsn(PUTFIELD, "asm/A", "a", "I");

等价于:
a = 2;


ii.静态字段:
1.创建:
FieldVisitor fv = cw.visitField(ACC_PRIVATE + ACC_STATIC, "a", "I", null, null);
fv.visitEnd();

等价于:
private static int a;

2.读取:
mv.visitFieldInsn(GETSTATIC, "asm/A", "a", "I");


3.设置:
mv.visitInsn(ICONST_2);
mv.visitFieldInsn(PUTSTATIC, "asm/A", "a", "I");

等价于:
a = 2;

d)方法:
i. 接口方法:
1.定义:
mv = cw.visitMethod(ACC_PUBLIC + ACC_ABSTRACT, "getA", "()V", null, null);
mv.visitEnd();


2.调用:
mv.visitVarInsn(ALOAD, 1);
mv.visitMethodInsn(INVOKEINTERFACE, "asm/IA", "getA", "()V");


等价于:
public interface IA{
     public void geA();
}
public class A implements IA{
     public void geA(){…}
}

IA a = new A();
a.getA();


ii.一般方法:
1.定义:
MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "getA", "()V", null, null);
mv.visitCode();
mv.visitInsn(RETURN);
mv.visitMaxs(0, 1);
mv.visitEnd();


等价于:
public void getA() {}


2.调用:
mv.visitVarInsn(ALOAD, 1);
mv.visitMethodInsn(INVOKEVIRTUAL, "asm/A", "getA", "()V");


等价于:
A a = new A():
a.getA();

iii.静态方法:
1.定义:
MethodVisitor mv = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, "getA", "()V", null, null);
mv.visitCode();
mv.visitInsn(RETURN);
mv.visitMaxs(0, 0);
mv.visitEnd();

等价于:
public static void getA() {}


2.调用:
mv.visitMethodInsn(INVOKESTATIC, "asm/A", "getB", "()V");

等价于:
A.getB();


iv.说明:一般方法比静态方法在声明和调用时均要多传入一个this引用作为参数。另外,当使用INVOKESPECIAL来调用方法时,虚拟机将直接根据指令当中所指明的类类型来调用方法;而当使用INVOKEVIRTUAL来调用方法时,虚拟机将根据实例的实际类型来调用方法。
e)异常处理:
i.声明:
mv.visitTryCatchBlock(l0, l1, l1, "java/lang/Exception");
mv.visitLabel(l0);
mv.visitLabel(l1);
…


等价于:
try {
…
} catch (Exception e) {
…
}


说明:在visitTryCatchBlock()当中,第一,二,三个参数均是Label实例,其中一,二表示try块的范围,三则是catch块的开始位置。而第四个参数则是异常类型。而当异常发生时,JVM将会将异常实例置于运行栈的栈顶。
分享到:
评论
1 楼 Mr_caochong 2012-02-06  
非常好的博文,例子实用

但是如何输出package信息呢

相关推荐

    ASM操作字节码,动态生成Java类class文件

    ASM操作字节码,动态生成Java类class文件,模拟Spring的AOP实现原理。

    ASM 帮助文档(java字节码操作)

    ASM 帮助文档(java字节码操作) 对字节码进行操作的jar包。

    ASM Java字节码操作框架

    ASM Java字节码操作框架PPT,结合已有AOP实现方法,对比所有对Java字节码操作方法做比较

    asm操作指南(中文)

    ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为。Java class 被存储在严格格式定义的 .class文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称、方法、属性...

    ASM4.0 中文教程与多种字节码编程实战案例

    内容包含ASM4.0中文手册,以及四种ASM常见的字节码操作应用范例,包含最新版本的ASM9.2的jar包,包含asm-9.2.jar,asm-commons-9.2.jar,asm-util-9.2.jar。 学习文章地址 ...

    ASM4使用指南

    ASM是一个通用的Java字节码操作和分析框架。它可以用于修改现有类或直接以二进制形式动态生成类。ASM提供了一些常见的字节码转换和分析算法,可以从中构建自定义复杂转换和代码分析工具。ASM提供与其他Java字节码...

    asm 6.0 工具集

    java字节码操作相关工具asm asm-util asm-tree asm-analysis

    java操作Excel环境easyExcel-2.0.5最新版本环境(自动适配属性),解决asm及cglib冲突等。亲测可用。

    java操作Excel环境easyExcel-2.0.5最新版本环境(自动适配属性),解决asm及cglib冲突等。亲测可用。asm.jar cglib-2.2.jar cglib-3.1.jar cglib-nodep-2.2.jar commons-collections4-4.1.jar easyexcel-2.0.5.jar ...

    ASM 4 Guide 中文版

    它可以动态生成二进制格式的stub类或其他代理类,或者在类被JAVA虚拟机装入内存之前,动态修改类。在ASM中提供了诸多的API用于对类的内容进行字节码操作的方法。与传统的BCEL和SERL不同,在ASM中提供了更为优雅和...

    asm4使用指南(强烈推荐)

    java使用asm4操作字节码技术,详细介绍了asm如何对java的字节码进行操作,强烈推荐

    ASM4.2 DEMO

    ASM 是java用于操作字节的框架,可以很方便的实现动态创建类,及已有对象的方法重载和更新

    asm-master.zip

    ASM是一个通用的Java字节码操作和分析框架。 它可以用于修改现有类或直接以二进制形式动态生成类。 ASM提供了一些常见的字节码转换和分析算法,可以从中构建自定义复杂转换和代码分析工具。 ASM提供与其他Java字节码...

    基于JPA及ASM9实现自动接口开发

    实现JPA基本数据库操作功能封装 实现基于ASM9,动态生成entity、repository、service、serviceImpl、controller相关.class 可根据库表,一键生成新增、修改删除、查询等接口 实现部分基于mybatis-plus,动态代码生成...

    asm-tree-3.3.1.jar

    通过这种API,用户可以更直观、更方便地理解和操作Java字节码。 例如,可以使用ASM Tree API遍历一个类的整个字节码结构,查找并修改特定的指令或属性,或者在运行时动态生成新的类和方法。此外,由于ASM Tree API...

    java字节码框架ASM操作字节码的方法浅析

    主要给大家介绍了关于java字节码框架ASM如何操作字节码的相关资料,文中通过示例代码介绍的很详细,有需要的朋友可以参考借鉴,下面来一起看看吧。

    asm-analysis-3.2.jar

    asm-analysis-3.2.jar 它包含了一个名为`AsmAnalysis`的类,这个类是ASM库的一部分,主要用于Java字节码的分析和修改。这个工具基于访问者模式实现,可以对字节码进行各种操作和分析。 ASM库提供了一套基于树API的...

    asm control 通过pc控制Android 手机界面的工具

    使用方式说明: 可通过 java -jar asm.jar 运行,是一个在电脑上显示和操作手机内容的工具。 资源仅供学习用途,不能作为商业用途,如有问题请及时联系删除。

    高效Java数据层操作框架FastQuery源码

    项目名称:FastQuery - 高效Java数据层操作框架 核心语言:Java 包含文件类型:Java源文件、XML配置、图像资源、SQL脚本、许可证、Markdown文档及JSON配置 文件统计:总计232个文件,具体分布如下 - Java文件:210...

    asm-commons-3.3.1.jar

    asm-commons-3.3.1.jar是一个Java字节码操作库,它提供了一组用于操作Java字节码的API。这个库主要用于在运行时动态修改类的行为,例如创建新的类、方法或字段,或者修改现有的类、方法或字段。 asm-commons-3.3.1....

    java源码剖析-asm:深入分析源代码和演示,Java字节码操作和分析框架

    java 源码剖析

Global site tag (gtag.js) - Google Analytics