本文共 1360 字,大约阅读时间需要 4 分钟。
等价于:
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将会将异常实例置于运行栈的栈顶。
转载地址:http://elodl.baihongyu.com/