你有两个解决方案:

1.在MethodVisitor中使用visitInsn(int opcode)方法:

//this is the custom method visitor

private class InsertInitCodeBeforeReturnMethodVisitor extends MethodVisitor{

public InsertInitCodeBeforeReturnMethodVisitor(MethodVisitor mv) {

super(Opcodes.ASM4, mv);

}

@Override

public void visitInsn(int opcode) {

//whenever we find a RETURN, we instert the code, here only crazy example code

switch(opcode) {

case Opcodes.IRETURN:

case Opcodes.FRETURN:

case Opcodes.ARETURN:

case Opcodes.LRETURN:

case Opcodes.DRETURN:

case Opcodes.RETURN:

mv.visitVarInsn(Opcodes.ALOAD, 42);

break;

default: // do nothing

}

super.visitInsn(opcode);

}

}

//this is the custom method visitor

private class InsertInitCodeBeforeReturnMethodVisitor extends AdviceAdapter{

public InsertInitCodeBeforeReturnMethodVisitor(MethodVisitor mv, int access, String name, String desc) {

super(Opcodes.ASM4, mv, access, name, desc);

}

@Override

protected void onMethodExit(int opcode) {

if(opcode != Opcdoes.ATHROW) {

mv.visitVarInsn(Opcodes.ALOAD, 42);

}

}

}

我个人更喜欢AdviceAdapter,因为它消除了对原始返回指令进行实际调用的麻烦,就像你必须使用第一个解决方案一样(例如super.visitInsn(操作码);).其次,它为访问RETURN指令(和ATHORW)提供了一个很好的抽象;这与vanilla MethodVisitor中的visitInsn(int操作码)方法不同,在那里你必须检测RETURN指令在诸如DUP,ICONST_0等许多其他方面的访问,这些访问可能与也可能与此问题无关.手.

但这又取决于手头的问题.如果这是唯一正在执行的仪器,我将坚持使用AdviceAdapter.如果你想要结合访问RETURN指令做其他事情,我可能会继续使用简单的MethodVisitor,因为它可能会给我更大的灵活性.话虽这么说,我一直在使用AdviceAdapter一年多的时间用于重型仪表驱动的项目,到目前为止它已经很好了!

编辑:

应用方法访问者

通常不清楚如何使用或应用方法访问者/方法适配器(至少对我而言),所以我在这里汇总了一个快速代码示例:gist.github.com/VijayKrishna/1ca807c952187a7d8c4d,它显示了如何使用方法适配器,通过它对应的class-visitor / class-adapter.在示例代码段中,我已经从我在此答案中使用的方法更改了方法适配器的名称,但它们执行相同的操作.此外,代码段显示了一个扩展AdviceAdapter的方法适配器.

总之,您首先“调用”类适配器,如下所示:

ClassReader cr = new ClassReader(in);

ClassWriter cw = new ClassWriter(ClassReader.EXPAND_FRAMES);

ReturnAdapter returnAdapter = new ReturnAdapter(cw, className);

cr.accept(returnAdapter, 0);

然后,您可以在类适配器的visitMethod方法中按照以下方法调整方法:

MethodVisitor mv;

mv = cv.visitMethod(access, name, desc, signature, exceptions);

mv = new MethodReturnAdapter(Opcodes.ASM4, className, access, name, desc, mv);

return mv;

java如何返回之前代码_java – 如何在每次返回之前向消息添加代码?相关推荐

  1. java 刷浏览量代码_Java刷视频浏览量点赞量的实现代码

    说明 这几天班主任一直让我们访问一个网页来观察看视频,增加访问次数.每个班级还有指定的名额...而且经过我的测试,点赞次数是在观看视频一会才出现的.. 可是身为计算机专业的 肯定不想一直点啊 点啊 于 ...

  2. java画图板代码_java学习小总结——画图板制做(附代码)

    学习java这门编程语言也有一个多月了.~若是能用本身学的编程语言去开发一些小程序软件能够说是本身一直求之不得吧!.模仿XP的画图板的开发则是学java来最先作的一个小软件.也是把以前学到的不少知识得 ...

  3. java主界面设置背景图片_java 窗体设置背景图片问题?(附上登陆界面代码,我想加个背景图片,求大神帮忙改改)...

    java 窗体设置背景图片问题?(附上登陆界面代码,我想加个背景图片,求大神帮忙改改) 关注:223  答案:4  mip版 解决时间 2021-01-26 22:09 提问者非莪莫属 2021-01 ...

  4. 希尔排序基础java代码_java 算法之希尔排序详解及实现代码

    摘要:这篇Java开发技术栏目下的"java 算法之希尔排序详解及实现代码",介绍的技术点是"希尔排序详解.实现代码.希尔排序.Java.实现.代码",希望对大 ...

  5. java map 多个值_java 一个函数EnumMap返回多个值

    在开发过程中,经常会有这种情况,就是一个函数需要返回多个值,这是一个问题!! 网上这个问题的解决方法: 1.使用map返回值:这个方法问题是,你并不知道如何返回值的key是什么,只能通过doc或者通过 ...

  6. java数据加密解密代码_java使用RSA加密方式实现数据加密解密的代码

    RSA的应用 RSA是一种非对称加密算法.现在,很多登陆表单的密码的都采用RSA加密,例如京东中的登陆使用公钥对密码进行加密 java使用RSA加密方式实现数据加密解密,需要首先产生私钥和公钥 测试代 ...

  7. java 鼠标动眼睛动_java实现眼睛跟着鼠标转动的跟踪眼代码

    import java.html" target="_blank">java.applet.Applet; import java.awt.Color; impor ...

  8. 个人纳税java代码_java工资纳税系统 c排班系统 程序代码

    java工资纳税系统 c排班系统 程序代码 package test;import javax.swing.JOptionPane;public class SalaryTax {/*** @para ...

  9. java 实现语音报警代码_Java实现发送手机短信语音验证功能代码实例

    这篇文章主要介绍了Java实现发送手机短信语音验证功能代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 利用第三方平台可以实现发送手机短信验证 ...

最新文章

  1. 解决pandas:ValueError: Cannot convert non-finite values (NA or inf) to integer
  2. 你的“苦劳”,真的不值钱!
  3. IOS中通知中心(NSNotificationCenter)的使用总结
  4. S/4HANA Product edit button - draft node
  5. 在C4C UI里嵌入CRM WebClient UI
  6. 高级Lucene查询示例
  7. Java EE 8发生了什么? (第2部分)
  8. 【Java从0到架构师】Spring - AOP
  9. vs附加其它计算机应用到进程,如何将VS代码附加到在docker容器中运行的节点进程...
  10. matlab min函数_数学建模与MATLAB非线性规划
  11. mybatis开发中遇到的小问题
  12. Twaver-HTML5基础学习(8)拓扑元素(Element)_网元(Element)、节点(Node)
  13. 3.并列句的起源与本质
  14. 揭秘组件库一二事(上)
  15. pygame-KidsCanCode系列jumpy-part12-platform图片
  16. 【网络编程开发系列】好端端的MQTT-broker重新部署后居然出现TLS握手失败了
  17. 一个正经的前端学习 开源 仓库(阶段十三)
  18. dede服务器建站_如何用DEDECMS建站的详细新手指南
  19. 会动的古代名画,如画的江南古镇
  20. 软件开发生命周期模型选择方法指南

热门文章

  1. 简单QT应用到通过手写布局实现QT应用
  2. 搭建和测试Android JAVA NDK
  3. Spring 中获取servletContext及WebApplicationContext以及applicationContext三者之间的关系
  4. 数据库除关系运算符执行过程详解
  5. Mysql物理逻辑备份概述
  6. Kettle使用_25 改变文件编码压缩与邮件
  7. python win10还是linux_在win10的Linux子系统(WSL)上搭载python编程环境
  8. 模式的秘密-观察者模式(二)
  9. java-HTMLjavaSkcriptCSSjQueryajax
  10. JAVA面试必备的知识宝典(一)