`
alvinqq
  • 浏览: 184888 次
  • 性别: 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.rar_asm_java

    ASM库在Java中通常用于创建字节码级别的操作,例如代码分析、转换和生成,这在构建复杂系统如ASM股市模拟器时可能很有用。 总的来说,这个`asm_java.rar_asm_java`压缩包提供了一个完整的ASM模型的Java实现,包括了...

    asm操作指南(中文)

    ### asm操作指南(中文)知识点总结 #### 一、ASM框架简介 - **定义与功能**:ASM是一个Java字节码操纵框架,主要用于动态生成类或增强现有类的功能。通过直接生成二进制`.class`文件,ASM能够在类被加载到Java...

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

    在Java开发中,ASM库允许我们直接操作字节码,这对于理解和实践AOP(面向切面编程)的概念尤其有用,就像Spring框架中的AOP实现。 面向切面编程(AOP)是一种编程范式,它允许程序员定义“切面”,这些切面封装了...

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

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

    ASM Java字节码操作框架

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

    Java字节码和asm入门资料

    ASM是一个开源的Java字节码操控和分析框架,它可以直接用来生成和修改Java类文件,是Java动态代理和字节码增强技术的重要工具。在深入学习Java字节码和ASM之前,我们需要先理解Java编译和运行的基本过程。 1. **...

    Mixin,MIXIN是使用ASM的Java的特性/混合框架.zip

    通过ASM,Mixin能够精确地定位并修改Java类的字节码,实现对目标类的精细操作。 Mixin框架的设计理念是基于面向切面编程(AOP)思想,但与传统的AOP实现不同,如Spring AOP,Mixin不使用代理模式。它直接将混入...

    cglib和asm

    ASM提供了一套直接操作Java字节码的底层API,允许开发者在运行时对类进行深度定制。ASM的强大之处在于其灵活性,但同时也要求使用者对Java虚拟机的内部结构有较深入的理解。ASM通常被用于编译器、代码分析工具或动态...

    ASM4手册中文版.pdf.zip

    ASM4是中国Java开发者常用的一款字节码操作框架ASM的第四个主要版本,它主要用于动态生成和分析Java字节码。ASM是一个低级别的库,可以直接操作和生成类的字节码,这在创建编译器、代码分析工具以及运行时代码修改等...

    ASM使用指南-中文版

    4. **Opcode**:Java字节码的操作码,ASM库提供了对应的常量,使得开发者可以直接引用它们来构造字节码序列。 5. **字段和方法的访问和修改**:ASM允许开发者添加、删除或修改类的字段和方法,包括其访问权限、类型...

    asm_java人工股市.zip_股市

    1. ASM框架:ASM是一个开源库,它允许对Java字节码进行低级别的操作,如生成、修改和分析。ASM的核心是ClassWriter和ClassReader类,它们分别用于创建新的字节码和解析现有的字节码。在人工股市项目中,ASM可能被...

    基于ASM的Java作业辅助批阅工具的实现.zip

    ASM提供了一组API,允许开发者直接操作字节码,这对于理解类的内部结构、进行动态代理、代码混淆、性能分析等任务非常有用。 二、ASM在作业批阅工具中的应用 在Java作业辅助批阅工具中,ASM主要负责以下任务: 1....

    基于ASM的Java作业辅助批阅工具的实现.pdf

    1. **代码自动修改**:通过ASM,工具可以直接操作Java字节码,对类文件进行无侵入式的修改,以适应批阅需求。 2. **关键类库使用分析**:监控和记录学生代码中对重要API的使用,提供详细的使用报告。 3. **调用频率...

    ASM函数监听实现(二)之打印注入函数的参数值

    这篇博客"ASM函数监听实现(二)之打印注入函数的参数值"深入探讨了如何利用ASM库来监控并记录函数调用时的参数值,这对于调试、日志记录以及性能分析等场景非常有用。 首先,我们来看`asmAopClassAdapter.java`。...

    asm-2.2.3.jar,asm-commons-2.2.3.jar,asm-util-2.2.3.jar

    使用ASM需要对Java字节码有一定的理解,因为它是直接操作二进制级别的API。不过,ASM提供了高级访问者模式,降低了使用难度,使得即使不精通字节码的开发者也能较容易地使用它。 总结起来,ASM是一个强大而灵活的...

    Java ASM,learn-java-asm-main.zip

    Java ASM 是一个强大的字节码操控和分析框架,它允许你在运行时动态生成类和接口,或者修改已存在的类。ASM 提供了低级别的访问,让你可以深入到 Java 类的内部结构,这对于创建代码生成器、编译器、性能监视工具等...

    asm4开发手册-英文原版

    描述中提到的cglib库动态代理底层采用ASM作为其字节码操作的工具,这说明cglib在实现Java中的动态代理时,依赖于ASM库来操作Java类的字节码。动态代理是指在运行时创建一个实现了目标接口的代理实例,代理实例会将...

    java asm 3.3.1

    1. **字节码操作**:ASM提供了一种低级别的接口,允许程序员直接操作Java字节码。它将类文件解析为一棵抽象语法树(AST),用户可以通过遍历和修改这棵树来生成或修改字节码。 2. **类访问器和方法访问器**:ASM...

    ASM字节码操作简单实例

    ASM字节码库是Java字节码操作的强大工具,它允许程序员在运行时动态生成类或者增强已有类的功能。在本实例中,我们将探讨如何利用ASM实现简单的面向切面编程(AOP)功能,这是一种在不修改源代码的情况下,添加额外...

    java-asm:java asm原始解析

    总之,Java ASM提供了一种底层的方式来操作Java字节码,它强大而灵活,但使用起来也需要一定的学习成本。在理解和掌握了ASM的基本原理和API后,我们可以构建出功能强大的工具和框架,以满足各种高级编程需求。

Global site tag (gtag.js) - Google Analytics