「调用外部」【开发者成长】如果你只写CRUD,那这种技术栈你永远碰不到( 三 )

  • 最后返回结果 IRETURN ,注意是返回的 I 类型。到此这段方法快就实现完成了。反编译后如下;
  • 这段执行操作和我们在使用 java 的反射操作一样,也是比较容易的。此时我们是调用了新的字节码类,同时还将字节码输出方便我们查看生成的 class 类。
    七、在原有方法上字节码增强监控耗时
    到这我们基本了解到通过字节码编程,可以动态的生成一个类。但是在实际使用的过程中,我们可能有的时候是需要修改一个原有的方法,在开始和结尾添加一些代码,来监控这个方法的耗时。这也是非侵入式监控的最基本模型。
    整体的代码块有点大,我们可以分为块来看,如下;
    ClassReader cr = new ClassReader(MyMethod.class.getName()); 读取原有类,也是字节码增强的开始ClassVisitor cv = new ProfilingClassAdapter(cw, MyMethod.class.getSimpleName()); 开始增强字节码onMethodEnter,onMethodExit,在方法进入和方法退出时添加耗时执行的代码。
    测试结果:
    直接运行TestMonitor.java;
    八、字节码控制打印方法的入参
    那么除了可以监控方法的执行耗时,还可以将方法的入参信息进行打印出来。这样就可以在一些异常情况下,看到日志信息。
    其他代码与上面相同,这里只列一下修改的地方
    从这里可以看到,在方法进入时候使用指令码 GETSTATIC,获取输出对象类
    • 接下来使用 ALOAD,从局部变量1中装载引用类型值入栈
    • 最后输出入参信息
    • 测试结果:
    直接运行TestMonitor.java;
    九、用字节码增强调用外部方法好!那么执行到这,我们可以想到如果只是将一些信息打印到控制台还是没有办法做业务的,我们需要在这个时候将各种属性信息调用外部的类,进行发送到服务端。比如使用;mq、日志等。
    定义日志信息输出类
    十、总结
    • 高级编程技术的内容还不止于此,不要只为了一时的功能实现,而放弃深挖深究的机会。也许就是你不断的增强拓展个人的知识技能,才让你越来越与众不同。
    • ASM 这种字节码编程的应用是非常广的,但可能确实平时看不到的,因为他都是与其他框架结合一起作为支撑服务使用。像这样的技术还有很多,比如 javaassit、netty等等。
    • 对于真的要学习一样技术时,不要只看爽文,但爽文也确实给了你敲门砖。当你要彻底的掌握某个知识的时候,最重要的是成体系的学习!压榨自己的时间,做有意义的事,是3-7年开发人员最正确的事


    推荐阅读