原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留出处。java
我讨厌写一些业务代码,不只仅由于它们的原始意图不是我设计的,成功了是产品的功劳,失败了代码要背锅。一个重要的缘由,就是重复的代码太多,一个复杂的业务逻辑要找到它的Bug,也要下一番“苦力”。这里说的真的是苦力,而不是脑力,说明了大部分是低劣的重复劳动。哦哦哦,我居然违背了精英主义论调。程序员
因此随着在项目中有了话语权,我会特别善待这些可怜的同窗们。一个问题,直到发现的时候,才发现它的低级,但中间的曲折,不多有人能看到,一个非技术出身的管理者对此就很难理解。职位越是高,就越关注总体的目标达成,对个体的感觉却关注的不多,这不是一个好的现象。千里之堤,溃于蚁穴。普通研发的总体水平表明了公司的竞争力。微信
扯远了。下面介绍几个开发中经常使用的工具包,能够在Java源文件、语法树、字节码之间进行转换。用好了它们,不只仅能实现一些黑科技,还能大大提升咱们的生产力。架构
有时候,咱们要作一些代码生成工具,须要生成一些Java类源文件。若是使用字符串去拼接的话,很容易拼的乱七八糟。为了解放双手,就可使用工具JavaPoet进行方法或者代码块的构建。它还提供了占位符等一系列方便的操做,使得你生成的代码优美可读,清脆爽口。并发
特别在写一些框架的时候,能够将一些很是脏、很是累的活儿交给它。框架
代码示例。高并发
MethodSpec main = MethodSpec.methodBuilder("main")
.addStatement("int total = 0")
.beginControlFlow("for(int i=0;i<10;i++)")
.addStatement("total +=i;")
.endControlFlow()
.build();
复制代码
JavaCC是一个语法生成器和语法分析器,能够经过读取一个.jj
(它是鸡鸡我是姐姐)描述文件来生成一个Java文件。听起来和JavaPoet同样,但它是语法层面的,过程是翻译而不是“构造”,和咱们学习的编译原理是一个层面的东西。并且JavaCC生成的文件通常是不可读的,谁让它和yacc以及lex比较像呢。工具
若是你想要自定义一些表达式,或者作一个特殊格式的解析器,你可能会用到它。学习
与此相似的还有ANTLR。应用方面,Velocity和FreeMarker都使用JavaCC做为语法解释器;Hibernate则使用ANTLR做为HQL的语法解释器。开发工具
不过我仍是更喜欢Ragel(不是Java的)多一些。对于这些场景来讲,文件生成之后就再也不依赖这些工具了,仍是高效和好用更重要。
上面是经过语法树生成Java文件(或者其余文件),Javaparser是经过Java文件生成语法树(AST),而后基于这棵语法树进行Java代码的分析和修改。注意,它能够直接再根据语法树,反向生成Java文件哦。
根据这棵语法树,你能够直接分析一个独立的Java文件,即便这个Java文件乱七八糟,不能经过编译,不用在运行时使用反射等功能。配合JavaPoet能够去作一些很是有意思的功能。好比,Javaparser提取Java文件的注释或者注解,而后经过JavaPoet生成一些自动文档(Swagger),或者进行测试用例的自动填充。
除了这些,Javaparser能够规定十分严格的语法格式,因此使用它作一个代码审查工具,甚至是作一些代码依赖分析,也是能够的。
其实这只是个辅助开发工具,应该有不少研发用起来了,它能够显著的减小代码量。让咱们摆脱恼人的get、set、hashCode、equals,甚至log等。
Lombok其实部分上和上面说到的Javaparser相似,不过它是JDK层面的。
在javac将Java文件解析成抽象语法树以后(AST),Lombok则根据本身的注解处理器,动态的修改AST,增长新的节点代码。而后,生成咱们最终的字节码。
这个技术,是由javac的注解API来实现的(JSR-269),可让javac在编译期去干一些事情。
JDK作的工做,远比咱们表面上用到的那些多的多。
上面几个工具都是把一些其余方式的代码转化为Java源文件,这些Java源文件还须要通过编译这道工序,才可以被真正使用。
ByteBuddy能够更进一步,直接动态生成Java类。对,就是直接加载在元空间的那种,在程序运行期间就能够动态的对class进行更改。不须要曲径通幽,直达目的。
它的底层是ASM,因此ByteBuddy是能够直接修改字节码的,是一种字节码加强工具。
于此相似的工具还有JAVASIST、CGLiB等。
若是你在作一些代理类的工做,或者作一些APM等,想要实现相似Aspectj之类的功能,再或者相似Arthas那样的故障排查工具,那这些工具正适合。
以上几个工具包,有些是比较偏门的,但它们完成的功能却很是酷炫。不只酷炫,并且很是有用。在领导们频繁开会,使用各类方法论探讨怎么管理文档,怎么自动化,怎么代码审查的时候,你就已经把功能完成了。
别告诉他们!
做者简介:小姐姐味道 (xjjdog),一个不容许程序员走弯路的公众号。聚焦基础架构和Linux。十年架构,日百亿流量,与你探讨高并发世界,给你不同的味道。个人我的微信xjjdog0,欢迎添加好友,进一步交流。