「调用外部」【开发者成长】如果你只写CRUD,那这种技术栈你永远碰不到( 三 )
七、在原有方法上字节码增强监控耗时
到这我们基本了解到通过字节码编程,可以动态的生成一个类。但是在实际使用的过程中,我们可能有的时候是需要修改一个原有的方法,在开始和结尾添加一些代码,来监控这个方法的耗时。这也是非侵入式监控的最基本模型。
整体的代码块有点大,我们可以分为块来看,如下;
ClassReader cr = new ClassReader(MyMethod.class.getName()); 读取原有类,也是字节码增强的开始ClassVisitor cv = new ProfilingClassAdapter(cw, MyMethod.class.getSimpleName()); 开始增强字节码onMethodEnter,onMethodExit,在方法进入和方法退出时添加耗时执行的代码。
测试结果:
直接运行TestMonitor.java;
八、字节码控制打印方法的入参
那么除了可以监控方法的执行耗时,还可以将方法的入参信息进行打印出来。这样就可以在一些异常情况下,看到日志信息。
其他代码与上面相同,这里只列一下修改的地方
从这里可以看到,在方法进入时候使用指令码 GETSTATIC,获取输出对象类
- 接下来使用 ALOAD,从局部变量1中装载引用类型值入栈
- 最后输出入参信息
- 测试结果:
九、用字节码增强调用外部方法好!那么执行到这,我们可以想到如果只是将一些信息打印到控制台还是没有办法做业务的,我们需要在这个时候将各种属性信息调用外部的类,进行发送到服务端。比如使用;mq、日志等。
定义日志信息输出类
十、总结
- 高级编程技术的内容还不止于此,不要只为了一时的功能实现,而放弃深挖深究的机会。也许就是你不断的增强拓展个人的知识技能,才让你越来越与众不同。
- ASM 这种字节码编程的应用是非常广的,但可能确实平时看不到的,因为他都是与其他框架结合一起作为支撑服务使用。像这样的技术还有很多,比如 javaassit、netty等等。
- 对于真的要学习一样技术时,不要只看爽文,但爽文也确实给了你敲门砖。当你要彻底的掌握某个知识的时候,最重要的是成体系的学习!压榨自己的时间,做有意义的事,是3-7年开发人员最正确的事
推荐阅读
- 特斯拉|特斯拉或将允许车主远程调用Autopilot摄像头
- 内置于APP程序内的广告,SDK广告的市场前景怎样,如有媒介的话,APP程序开发者.媒介.广告商咋分成的
- 如果你是AppStore的工作人员,你想咋帮助中国区的开发者列举你最想做的2件事情
- 参见Esri开发者大会是一种咋样的体验
- 国内Android个人开发者的应用怎样收费
- webpack打包后的页面,在集成时,怎样提供js接口给父页面调用呢
- javascript 中this的四种调用模式
- C语言多维数组声明调用和c为啥差别这么大
- 阿贵看车|专访|宋军:后千万时代,吉利汽车更强调用户体验
- macOS 用PHP调用curl抓取不到https的数据
