城市直播房产教育博客汽车
投稿投诉
汽车报价
买车新车
博客专栏
专题精品
教育留学
高考读书
房产家居
彩票视频
直播黑猫
投资微博
城市上海
政务旅游

方案设计基于IDEA插件和字节码插桩,实现研发交付质量自动分

11月19日 火云谷投稿
  作者:小傅哥
  博客:https:bugstack。cn包含:Java基础,面经手册,Netty4。x,手写Spring,用Java实现JVM,重学Java设计模式,SpringBoot中间件开发,IDEA插件开发,DDD系统架构项目开发,字节码编程。。。
  沉淀、分享、成长,让自己和他人都能有所收获!一、前言
  如何保证代码质量?
  业务提需求,产品定方案,研发做实现,测试验流程。四种角色的相互配合是确保一个需求上线的必备条件。在整个需求的交付质量级别划分中,研发与测试是非常重的一环,如果研发提测的代码质量不高,就会出现不同级别的修BUG、返工甚至重做的风险。
  那么,怎么来提高代码质量呢?一般我们都会要求研发在开发代码的过程中编写单元测试,验证自己的代码逻辑。如果最终单元测试覆盖度不足,可以由测试拒绝研发提测。
  但是,整个需求实现的代码是在全部开发完成后提测的,也就是临近上线的最后一环,大家才知道某个研发的某个功能域的实现是否具备提测条件。如果这个时候代码质量不高,那么接下来就是项目风险的时候。压测试时间、调上线时间,总之有病拖着最后成大病了!
  当然,你可以在项目开发期间定期排查代码,或者在日会进度反馈等等手段。可这样需要耗费大量时间1拖1的开发排查方式很难满足复杂流程的较大型项目开发,而且对于项目风险把控也是不可预估的。
  所以,我们希望采集研发在开发过程中的执行动作,把风险判断提前。实际操作举例就是,当你开发完成一个接口,开始测试运行时,我们的插件就可以采集到这个接口的全部信息,包括:接口名称、入参类型和内容、出参类型和内容、异常信息、调用关系链等。而再把这些信息汇总提交到服务端,生成本次需求代码分支下的全部接口动作,以及各系统间的关系链路,并附带随时生成最新的接口文档和一键测试验证功能。后期测试人员介入时就可以参考研发在编码过程中的全部测试用例,也可以查看整个功能的覆盖程度,此外测试人员测试过程中的数据也会被保留下。现在拥有这些数据信息以后,就可以完整的生成一套研发测试质量交付全览图,让整个工程开发交付质量评估透明化。
  接下来我们就按照以上的描述性内容,实践开发一个案例体会下。走起!二、技术实现准备字节码插桩,因为我们需要采集到接口执行信息,那么就需要使用字节码插桩组件给接口方法增强。这个实现有点类似谷歌的Dapper,大规模分布式架构的非入侵监控。只不过我们需要采集的描述性信息更多。关于字节码插桩,可以了解ASM、Javassist、ByteBuddy,它们都可以做此项工作。IDEA插件开发,因为我们需要在研发人员开发过程中进行采集,也不破坏研发的操作习惯。那么最好的方式就是嵌入到启动运行中,只要在开发过程中有运行代码的动作,就采集相应的接口信息。最后就是数据的传输和处理,传输可以使用MQ或者直接用Netty。而处理数据的过程会相对比较复杂,在这个过程需要分析出有价值的数据,同类的数据,合并一条执行链路的数据,以及生成相关的接口文档和工程服务地图。三、对字节码插桩
  这里我们使用的字节码插桩组件是Bytebuddy,它是一个代码生成和操作库,用于在Java应用程序运行时创建和修改Java类,而无需编译器的帮助。除了Java类库附带的代码生成实用程序外,ByteBuddy还允许创建任意类,并且不限于实现用于创建运行时代理的接口。此外,ByteBuddy提供了一种方便的API,可以使用Java代理或在构建过程中手动更改类。无需理解字节码指令,即可使用简单的API就能很容易操作字节码,控制类和方法。已支持Java11,库轻量,仅取决于Java字节代码解析器库ASM的访问者API,它本身不需要任何其他依赖项。比起JDK动态代理、cglib、Javassist,ByteBuddy在性能上具有一定的优势。1。方法入口publicstaticvoidpremain(StringagentArgs,Instrumentationinst){AgentBuilder。Transformertransformer(builder,typeDescription,classLoader,javaModule){returnbuilder。method(ElementMatchers。any())拦截任意方法。intercept(MethodDelegation。to(MonitorMethod。class));};newAgentBuilder。Default()。type(ElementMatchers。nameStartsWith(agentArgs))。transform(transformer)。installOn(inst);}
  如果你接触过Javaagent开发,那么对于premain会比较熟悉。如果不清楚你可以把它理解为,它是程序启动的时的方法入口,你可以从这个入口中拦截到你需要的方法,之后对它进行字节码增强。其实也就是动态写代码,在方法中添加你的代码,来收集方法信息。2。采集信息RuntimeTypepublicstaticObjectintercept(OriginMethodmethod,SuperCallC?callable,AllArgumentsObject〔〕args)throwsException{longstartSystem。currentTimeMillis();ObjectresOtry{resObjcallable。call();returnresO}finally{System。out。println(方法名称:method。getName());System。out。println(入参个数:method。getParameterCount());for(inti0;imethod。getParameterCount();i){System。out。println(入参Idx:(i1)类型:method。getParameterTypes()〔i〕。getTypeName()内容:args〔i〕);}System。out。println(出参类型:method。getReturnType()。getName());System。out。println(出参结果:resObj);System。out。println(方法耗时:(System。currentTimeMillis()start)ms);}}
  这个就是使用ByteBuddy可以采集的信息,你可以通过注解入参,获取到一个方法的全部信息。方法名称、入参个数、入参类型和内容、出参类型和结果以及还能计算方法执行耗时。四、IDEA插件开发
  关于IDEA插件开发的知识内容较多,可以从GitHub搜索一些资料和查阅官方文档:https:plugins。jetbrains。comdocsintellijgradlebuildsystem。html?fromjetbrains。org
  此处演示案例关于插件开发的内容比较简单,主要是继承com。intellij。execution。impl。DefaultJavaProgramRunner,OverridedoExecute方法,添加自己需要的内容即可。
  这部分添加的内容核心就是在程序启动时添加我们的字节码插桩程序,如下:OverrideprotectedRunContentDescriptordoExecute(NotNullRunProfileStatestate,NotNullExecutionEnvironmentenv)throwsExecutionException{JavaParametersparameters((JavaCommandLine)state)。getJavaParameters();信息获取PsiFilepsiFileenv。getDataContext()。getData(LangDataKeys。PSIFILE);StringpackageName((PsiJavaFileImpl)psiFile)。getPackageName();添加字节码插装ParametersListparametersListparameters。getVMParametersList();parametersList。add(javaagent:this。getClass()。getResource()。getPath()。substring(1)ProjectProbe。jarpackageName);returnsuper。doExecute(state,env);}
  此处最核心的就是javaagent把ProjectProbe。jar工程探针程序的Jar包加载进去。其他的就是一些关于PsiFileAPI的使用,感兴趣可以阅读官方文档中的介绍。五、效果演示
  安装插件
  安装插件就和我们正常安装一样,不过目前这个插件在开发阶段,所以需要本地安装。
  运行效果
  上图就是运行效果的案例演示,我们把运行时接口的信息完整的输出到控制台。在实际使用的过程中,会把这部分信息传回服务端,由服务端分析处理后,展示在页面上。六、总结基于IDEA插件和字节码插桩技术,能做的功能实现还有很多。本文仅仅是其中一种研发到测试痛点的解决方案,如果感兴趣可以一起深入研究。当你看到这样的案例以后,希望能给你的是并不一定所有的技术点都是为了面试造火箭对话的。当你真的把它落地以后,才会懂的自己需要很多知识。本文没有太过多的介绍插件开发和字节码技术,如果对字节码编程感兴趣,可以在公众号【bugstack虫洞栈】,回复【字节码编程】。全书11万7千字,20个章节涵盖三个字节码框架(ASM、Javassist、Bytebudy)和JavaAgent使用并附带整套案例源码!
投诉 评论 转载

对话哈弗高管哈弗决战新能源的狠招已在路上如果拿大象和蚂蚁比灵活,自然掉头的速度蚂蚁更快。但如果比的是长跑,那小蚂蚁大概率只能收获绝望。进入到2023年,很明显车圈的焦点还是回归到了传统企业身上。之前包括特斯拉打起的价……怀孕初期不能踩的坑(建议收藏)当知道自己怀孕了,我相信好多人都处在高兴、紧张的氛围里,在高兴的同时我要告诉大家,一定要多加注意,特别是怀孕的头三个月,头三个月许多妈妈都是害喜的阶段,每个人害喜都有不同,会产……后富一代吐血创业自述年如何成为亿万富翁我是小明,70后。关于我的段子,都指向我很逗逼,也很苦逼。我想告诉你,其实我很牛逼。30年商海沉浮,商界混迹,可谓所向披靡,天下无敌。不是自我吹嘘,咱有图文为据:我那牛逼……文旅局长花式内卷昆明如何接招?来源:【昆明日报掌上春城】近日,文旅局长零下20摄氏度穿长裙代言家乡的短视频登上热搜。视频中,在零下20摄氏度的黑龙江省塔河县白桦林里,当地文旅局局长都波身穿鄂伦春族服饰……携程今年来女性出境占比达53五一订单量超男性110红网时刻新闻3月8日讯(通讯员张大伟)3月8日,携程发布《2023她旅行消费洞察报告》。报告显示,2023年至今,女性整体旅游订单同比去年增长超过14倍,整体旅游消费均价高于男……用党建引领教科研工作提质增效无论是教育主管部门对学校的检查与评估,还是学校对教师的考核与评价,教科研都是一个非常重要的项目,教科研对教育发展的重要性不言而喻。用量化的方式对学校及教师个体的教科研成果……方案设计基于IDEA插件和字节码插桩,实现研发交付质量自动分作者:小傅哥博客:https:bugstack。cn包含:Java基础,面经手册,Netty4。x,手写Spring,用Java实现JVM,重学Java设计模式,Spri……67万米高空,紧盯洲际导弹发射,日本先进卫星,炸在了太平洋上H3火箭的发射失败,让日本重金打造的地球观测卫星与二级火箭一起,炸碎在了太平洋上空。这颗卫星不仅仅是一颗昂贵的民用卫星,同时还承载着日本自卫队监视东亚地区的私心。(ALO……就这样埋下一颗热爱写作的种子曾几何时,对于作文,我总是敬而远之。写作二字对于我来讲,是特别的难。在之前,我的作文没有真情实感,可以说只是东拼西凑罢了。成绩也因此而提高不了,一直处于中偏下水平。……时来天地皆同力,运去英雄不自由!人到中年你不能不知命啊头条创作挑战赛一个人到了40岁还不相信有命,那此人悟性太差。这是复旦哲学教授王德峰的名言。他认为,一个人在年轻的时候可以不相信命运这回事,但到了中年阶段,如果……宏碁宏碁股份有限公司(Acer)是台湾重要的国际品牌公司,由施振荣等人于1976年8月1日创立。概况宏碁集团是台湾最著名的信息科技相关公司之一。至2000年开始正式切割……为害造句用为害造句大全61、这就是成长吗?像一页页翻书的感觉。靠近,只是因为害怕孤独。再见。我知道,若没有离别,成长也就无所附丽。七堇年62、因为害羞而不敢和他凝视的目光相遇,她把头扭开了。……
王吾平西夏的风生命无关乎年龄丹麦羽毛球公开赛即时赛果及明日对阵S1183重磅更新!PS2023ACR15。0惊艳而来美国又开始做梦了再次加大芯片封锁,想遏制中国半导体产业发展以今秋为新起点,共祝祖国繁荣昌盛女人打心底里喜欢你,会是什么样子?居民医保缴费为什么每年都在涨?一起来了解一下国货之光!华为Mate50被国家博物馆收藏,多款麒麟芯片也入曝足协调查马宁遗像事件,河南队恐难逃处罚日本19岁天才知耻而后勇!张本智和再胜国乒夺双冠,林高远太窝美国CPI回落,再收割日元,日本或变穷,或上演金融珍珠港,已黑鲨4s怎么设置指纹指纹添加方法老屋小记(6)麻木的我宝宝夏季睡眠小的常识解读买旅行箱什么材质的好购买旅行箱的材质推荐男性当心别让精子被大蒜“算计”到老公几把太大什么体验特蕾莎梅告别唐宁街10号,致辞感谢内阁工作人员保护孩子好奇心,抓住学习敏感期白酒冷知识茅店宝宝专注力比较差用什么方法可以解决

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找