当前位置: 首页 > 科技观察

一个bug让我发现了Java世界中的.AJ(圆锥)

时间:2023-03-14 11:47:04 科技观察

说来也奇怪,只要你在学习编程,从最初接触Java到安装JDK、IDEA、MYSQL,再到接触Spring、MyBatis、RPC、MQ,即使你有时在一个浅坑,你会跳进去尝试新事物。抓住你的头发并用一只手指向你的鼠标也几乎是你的常态。您的键盘上总是有很多划伤的毛发!不过,就是这样的发型,还是遇到了一个满脑子都是骚操作的家伙。“付哥,为什么我的段子不能截取呢?我是按照你的《SpringBoot 中间件设计和开发》专栏写的,你给我看看,我都折腾了一天了。”接下来我就带大家看看什么是快乐星球,他是怎么做到这样的节目还不被版块拦截的!二、满脑子骚操作1、遇到问题上周,谢吉吉(化名)把自己亲手制作的中间件的源码发过来,说代码里什么都没有,怎么砍不出来?一开始粗心大意,让谢吉吉发了一些代码截图。看截图中的代码,这和我写的中间件中的代码是一模一样的。没有问题,包路径也可以扫描。为什么不能剪?我说你可以设个断点调试看看为什么不能断?哎,调试完直接通过了,就是没砍。这时候想到JDK版本、环境配置、Spring上下文、切面定义、包路径,这小子是不是在耍我?最后抱着这小子糊弄自己的心,求源码。2.我发现了问题。看了好几遍源码没发现问题。我开始调试,但它真的没有进入这个部分。下一个;感谢您保留飞机的源代码,并复制了一个新的。我的目的是让他跑步和学习。接下来,我从我自己的项目中复制并粘贴了DoJoinPoint。我查了一下,贴进去了,没有提示更换。虽然报错了,但是两个类竟然可以共存,如下:太神奇了。我怀疑不是。那么DoJoinPoint不是正经的Java类,路径不对?有看不见的特殊字符?既然发现这个类不对,先把这行删掉。让程序先跑起来,保证除了这个类以外的其他内容没有问题,这样容易排查问题。还别说,去掉这个错误类,程序就可以正常运行了,section的内容被截取了。现在程序可以运行了,我想我可以看出问题出在哪里了。没想到刚打开一个文件夹,就发现了一个神奇的AJ!这根本不是Java类!3.问题排查如果IDEA没有把.aj显示为C类图标,问题可能早就被发现了。紧接着,我把这个错误类的截图发给了谢吉吉,问你是怎么创建的?他实话实说,谢季飞先说他偷懒,哈哈哈,让人觉得尴尬!他说,他在创建DoJoinPoint的时候,看到一个Aspect选项,以为是创建aspect的捷径,如图;创建完成后,他发现不对劲,不是class类型,而是aspect,于是手动将aspect改为class,如图;所以,谢吉吉实际创建的是一个.aj结尾的切面类,并不是正经的Java类,所以没有切面,根本没有对应的类文件。3、如何正确使用Aspect的.aj类AspectJ,简称AJ。我说的AspectJ其实就是AOP的一种实现技术。其功能类似于拦截器,集成在IntelliJIDEA开发工具中。在使用IntelliJIDEA编写AspectJ代码之前,需要先安装AspectJ工具包。不然你的.aj类跑不起来,IDEA类显示的.aj类也是C的标志。接下来说说这个东西怎么用,别被.aj骗了。1.安装AspectJ在使用AspectJ之前,需要先去官网下载一个安装包,地址:https://www.eclipse.org/aspectj/downloads.php如果从官网下载很慢,你可以从我提供的源代码中得到它。也可以通过其他方式搜索下载aspectj-1.9.4.jar来下载并完成安装;双击安装命令安装java-jaraspectj-1.9.4.jar配置说明:不用配置,傻瓜直接下一步会在C盘创建一个文件夹C:\aspectj1.9,包括:bin,doc,lib等,后面会用到。2、AspectJ插件在IDEA专业版中开发AspectJ需要安装以下两个插件:SpringAOP/@AspectJAspectJSupport3。添加依赖aspectjrt.jar开始前需要在项目中添加aspectjrt.jar依赖,aspectjrt.jar是AspectJ安装目录中lib目录下的jar包。可以复制到项目中导入,也可以直接导入。右击项目,点击OpenModuleSetting打开ProjectStructure,点击Libraries选项卡,上面的+号,新建一个NewProjectLibrary并选择C:\aspectj1.9\lib\aspectjrt.jar路径,点击即可完成配置4.配置AspectJ编译器IDEA默认使用javac编译器,这里需要配置AspectJ编译器ajc,在IDEA中进行配置。打开IDEA->File->Settings对话框,选择Build,Execution,Deployment->Compiler->JavaCompilerUsecomplier:选择Ajc,在Pathtoaspectjtools.jar5配置路径C:\aspectj1.9\lib\aspectjtools.jar。案例测试CreateAspectclasspublicaspectDoAspect{pointcutlogPointcut():call(*ApiTest.hi(..));voidaround():call(voidApiTest.hi(..)){System.out.println("调用开始...");继续();System.out.println("通话结束...");}before():logPointcut(){System.out.println("方法执行之前");}after():logPointcut(){System.out.println("方法执行之后");}}测试类publicclassApiTest{publicvoidhi(){System.out.println("HiAspect");}publicstaticvoidmain(String[]args){ApiTestapiTest=newApiTest();apiTest.hi();}}测试结果调用开始...方法执行beforeHiAspectcall结束...方法执行afterProcessfinishedwithexitcode0tothis,then是打开Aspect类的正确方式,也可以尝试使用Aspect.本文只是介绍这种切面写法。4.综上所述,你的代码越粗、越大胆、越骚,遇到的问题就越多。可能是因为你没有遵循某些研发实施规范,所以你遇到的这些愚蠢的问题几乎会浪费你的早晨或一天。但有时候如果你能认真对待自己犯的bug,深入分析它是如何产生的,再复现一点点深入研究,说不定也会有意想不到的收获,说不定。因此,如果您是认真的,那么一切都没有错。关于切面、源码、开发,可能不仅仅着眼于功能实现,有时甚至会想办法逃避日复一日长不出来的工作内容。在那些有价值的技术上努力,你会收获最大。