「来源:|冰河技术ID:hacker-binghe」
大家好,我是冰河~~
最近和不少小伙伴聊天,发现大部分小伙伴,其中可能就包括正在看文章的你和我,工作时间已经不短了,有些小伙伴工作3~5年了,有些甚至超过8年了。
但是大部分小伙伴平时的工作都是在简单的做着CRUD,疲于应付日常工作中的业务开发和修复系统Bug,每天都会加班到很晚。根本没时间去提升自己的技术能力,久而久之,自己的技术能力和工作年限出现了严重的不匹配现象。
题外话
其实,针对这些情况,有不少小伙伴曾不只一次的问过我:冰河,我感觉我的职业生涯很迷茫,能给我点建议吗?我工作时间不短了,整天做一些CRUD的工作,根本没时间学习啊!
说实话,在互联网这个行业里,每个人或多或少的都会有过这种迷茫的阶段吧,我也有过。只不过我会让这种迷茫的感觉瞬间消失,更过的是去思考究竟是什么让我产生了这种迷茫的感觉?是技术能力?是业务理解?是人际交往?是职场规则?等等。。。
我会把这些可能导致我迷茫的因素结合自身的实际情况进行深度分析:
如果是技术能力不足导致我产生了迷茫感,那我就会抓住一切可利用的业余时间提升自身技术能力。如果是对公司的业务理解不足导致的迷茫感,那我就会加强对业务的理解,不断熟悉、推演、反复论证。如果是人际交往存在问题导致的迷茫感,那我就会加强对于人际关系的处理能力。如果是不熟悉职场规则导致的迷茫感,那我就会加强个人的职场素养。消灭导致迷茫感的其他因素。所以,小伙伴们产生迷茫感并不重要,重要的是要分析出让你产生迷茫感的因素有哪些,是外在因素还是内在因素。找到让你产生迷茫感的因素之后,再将这些问题逐渐分解,慢慢提升自己缺乏的某种技能。这个过程或许比较漫长,可能需要几天,几个星期或者几个月的时间,这就需要各位小伙伴们要踏下心来慢慢沉淀和积累了。
冰河送给大家一句话:持之以恒,贵在坚持,每天进步一点点。
说了这么多,算是对正在处于迷茫期的小伙伴们的一点小小的建议吧。
好了,为了帮助小伙伴们尽快的度过迷茫期,冰河希望能够在技术上更多的帮助到大家,从今天开始,为大家分享一些关于字节码编程的知识,这或许是你一直从事CRUD工作根本没有接触过的。
动态字节码技术
了解Java的小伙伴都知道,我们使用Java编写的代码是需要编译成字节码之后才能在JVM中运行的,而字节码一旦被加载到JVM的内存中,就可以被解释执行了。而Java源代码并编译后往往会生成对应的class文件,其实只要是文件,或多或少的就可以被修改。
如果我们使用某种技术按照某种规则对字节码文件进行了修改,重新定义了字节码的执行逻辑,或者加上我们自己的逻辑,这样不就改变了原有代码的执行逻辑吗?
除了修改原有的字节码之外,我们也可以利用动态字节码技术来动态创建一个新的类,使其完成我们想要的业务逻辑。
动态字节码的优势就是可以不改变之前的源代码,在程序生成字节码后,对生成的字节码进行修改,或者在运行期间动态生成新的类或者方法,可以真正的做到零侵入。
如何实现字节码编程
在Java领域,有很多可以实现动态修改字节码的技术,比较流行的应该有三个:ASM、Javassist和Bute-buddy。
ASM:直接操作字节码的指令,执行的效率比较高,但是要求使用者提前掌握Java字节码文件的格式和指令,对于使用者的要求比较高。Javassist:提供了高级的API,执行的效率和ASM相比,相对要差一些,但是无需了解Java字节码的格式和指令,对于使用者的要求比较低。Bute-buddy:提供了高级的API,执行的效率和ASM相比,相对要差一些,但是无需了解Java字节码的格式和指令,对于使用者的要求比较低。字节码编程使用场景
试想,某天,你正坐在工位上愉快的敲着Bug,此时你的技术领导让你实现这样一个需求:在程序的运行期间,向某个类的某个方法的前面和后面加入某段业务代码,或者根据具体的业务场景替换掉某个方法的执行逻辑。你的领导又特别对你提醒了一句:注意是在运行期间动态修改,要作者零侵入,不要在源代码的基础上修改。
听到这个需求时,你或者会想到Spring的AOP代理技术,没错,Spring的AOP代理技术确实可以实现这个需求。但是这样做需要在被代理的方法上添加注解,修改了原有的代码,不符合需求。另外,使用Spring的AOP技术的性能会比字节码编程低。
此外,大量的开源框架底层也使用到了字节码编程技术。例如,阿里开源的Dubbo、Arthas等。
字节码编程还有一个非常重要的核心应用场景——APM(应用性能管理)的实现。后面冰河会带着大家手撸一个完整的可使用的APM系统。
入门案例
开发环境
JDK1.8IDEA.03完整代码
冰河已将本文章的完整案例代码提交到了GitHub和Gitee,目前正在已案例的形式持续更新,后面会基于字节码编程实现一个可用的APM系统。
GitHub: