java asm 书_使用ASM来书写Java代码-2(zt)续2

等价于:

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将会将异常实例置于运行栈的栈顶。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值