aspectj手写权限申框架预习_第1页
aspectj手写权限申框架预习_第2页
aspectj手写权限申框架预习_第3页
aspectj手写权限申框架预习_第4页
aspectj手写权限申框架预习_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

AOPOOPSpring重要内容,是函数式编程的一种衍生范型。利AOP部分进行各部分之间的耦合度降低,提高程序的可重用性,同时提高了AOPOOPSpring重要内容,是函数式编程的一种衍生范型。利AOP部分进行各部分之间的耦合度降低,提高程序的可重用性,同时提高了1.1主要功能日志记录,性能统计,安全控制,事务处理,异常处理1.2主要目标将日志记录,性能统计,安全控制,事务处理,异常处理码中划分出来,通过对这些行这些行为的时候不1.3适用对象OOP力有日志、性能、安全、异常处理1.4AOPOOP装,以获得更不是单一的类,不OOP不是单一的类,不OOP是处理AOP不OOP了OOP不足。OOP了问题,AOPAOP.1意思就是意思就是ajc器Java器.ajaspectj在Java编译器的基础上增加了ajc器Java器.ajaspectj在Java编译器的基础上增加了weaver织入器:为了在java编译器上使用AspectJ而不Ajc器,aspectJ5了@AspectJ,AspectJJava器AndroidStudioajc器Android@AspectJ(SpringAOP)目标程序,根据切点(PointCut)Aspect(Weave)到目标程序的.class了重构(象、方法、参数等上下文信息),AOP2.1Gradle配置示AspectJAndroidGradle行classpath'org.aspectj:aspectjtools:1.8.9'import行classpathcompileimportorg.aspectj.bridge.IMessageimportorg.aspectj.bridge.IMessageimportorg.aspectj.bridge.MessageHandlerimportorg.aspectj.tools.ajc.Main//gradleandroid.libraryVariants.all{variantLibraryPluginplugin=project.plugins.getPlugin(LibraryPlugin)JavaCompilejavaCompile=variant.javaCompilejavaCompile.doLast{String[]args=["showWeaveInfo","inpath",javaCompile.destinationDir.toString(),"aspectpath",javaCompile.classpath.asPath,"d",javaCompile.destinationDir.toString(),"classpath",javaCompile.classpath.asPath,MessageHandlerhandler=newMessageHandler(true);newMain().run(args,handler)deflog=for(IMessagemessage:handler.getMessages(null,true)){switch(message.getKind()){casecasecaselog.errormessage.message,message.thrownmessage.message,message.throwncaselog.debugmessage.message,message.thrown2.2基本概念2.2.1切面——实现crosscuttinglogging2.2基本概念2.2.1切面——实现crosscuttinglogging法执行AOP了,我们可以针对不同的需求做出不//aspectj{disableWhenDebugtruejavartNeededtrueexcludegroup:'xxxx',module:'xxxx'compileOptions{defaultJavaVersion=buildscript{repositories{dependenciesclasspath'com.meituan.gradle:roboaspectj:0.9.2'classpath'jaop.gradle.plugin:gradleplugin:1.0.2'//Excludetheversionthattheandroidplugindepends2.2.2连接点——findInfo(String)AspectJ行JoinPoint2.2.2连接点——findInfo(String)AspectJ行JoinPoint行下面列AspectJjoinpoint2.2.3切点——pointcutadvicejointpoint达式来进行匹配应用,决定了jointpointcallexecution、target、this、within达式来进行匹配应用,决定了jointpointcallexecution、target、this、within1.JoinPointpointcutsJoinpointJPointJPoint,每一个函数执行找到目标的表2列出了JPoint表2列出了JPoint使用且call(<列arg()call(<列arg()@Around(value="execution(*BitmapFacade.picasso.init(java.lang.String,java.lang.String))&&publicObjectaroundArgs(Stringarg1,Stringarg2,ProceedingJoinPointjoinPoint){System.out.println("aspectsarg="+arg1.toString()+""+arg2);ObjectresutObject=null;try{resutObject=joinPceed(new}catch(Throwablee){@Pointcut("execution(**..Activity+.onStart(..))&&within(com.meituan.hotel.roadmap.*)")publicvoidonStart(){}@Pointcut("call(@Describepublicvoidcom.davidkuper.MainActivity.*(..))")publicvoidpointCut(){}@Pointcut("call(*android.widget.Toast+.show(..))&&(within(com.meituan..*)||publicvoidtoastShow()@Pointcut("call(@Describepublicvoidcom.davidkuper.MainActivity.init(Context))")publicvoidpointCut(){}通过2.2.4通知——pointcut通过2.2.4通知——pointcutadvice(包括:beforeafter、around)(1)@Before、例privatestaticfinalStringINSTANCE_METHOD_CALL@paramepublicvoidhandle(Exceptione){}@Around("execution(static*tBitmapFacade.picasso.init(..))&&!within(aspectj.*)")publicvoidpointCutAround(ProceedingJoinPointjoinPoint){ObjectresutObject=null;try{Object[]args=joinPoint.getArgs();resutObject=joinPceed(args);}catch(Throwablee){returnreturn@param@parame@param@parame@AfterThrowing(pointcut="afterThrow()",throwing="e")publicvoidafterThrowing(JoinPointjoinPoint,Exceptione){Log.e(TAG,joinPoint.getTarget().getClass().getSimpleName()+"afterThrowing():"+privatestaticfinalStringPOINTCUT_METHOD"(execution(*android.app.Activity+.*(..))||execution(**..Layout+.*(..)))&&@Pointcut(POINTCUT_METHOD)publicvoidmethodAnnotated(){@Around("methodAnnotated()")publicObjectweaveJoinPoint(ProceedingJoinPointjoinPoint)throwsThrowable{行Objectresult=joinPceed();returnresult;"call(!static*com.meituan.hotel.roadmap..*.*(..))&&target(Object)";@Pointcut(INSTANCE_METHOD_CALL)publicvoidinstanceMethodCall(){@Before("instanceMethodCall()")publicvoidbeforInstanceCall(JoinPointjoinPoint){printLog(joinPoint,"beforeinstancecall");@After("instanceMethodCall()")publicvoidafterInstanceCall(JoinPointjoinPoint){printLog(joinPoint,"afterinstancecall");2.3执行原AspectJ.class2.3执行原AspectJ.class行代码注入的方式将通知(Advise)pointCutAdviseJoinPoint这样在程序运行AdviseJoinPointBeforeAfterBeforeAfterJoinPointBefore\AfterAdviseJoinPoint行2.3.2Around2.3.2Around替换,通过一个单独的闭包拆分来执行JoinPoint行了代理ExampleprintLog()方法进行代理ExampleprintLog()方法进行getValue()AdvisepublicclasspublicclassExample{Stringvalue="value";publicvoidprintLog(){Stringstr=publicStringgetValue(){returnvalue;网上给的反编译过程都是hotel_road_mapdebugjar里网上给的反编译过程都是hotel_road_mapdebugjar里类,不知道什publicclassExampleprivatestaticfinalStaticPartajc$tjp_0=null;privatestaticfinalStaticPartajc$tjp_1=privatestaticfinalStringINSTANCE_METHOD_EXECUTING="execution(!static*@Pointcut(INSTANCE_METHOD_EXECUTING)publicvoidinstanceMethodExecuting(){行@Around("instanceMethodExecuting()")publicObjectInstanceMethodExecutingAround(ProceedingJoinPointjoinPoint){Objectresult=printLog(joinPoint,"instancereturn例privatestaticfinalStringINSTANCE_METHOD_CALL="call(!static*@Pointcut(INSTANCE_METHOD_CALL)publicvoidinstanceMethodCall(){@Before("instanceMethodCall()")publicvoidbeforInstanceCall(JoinPointjoinPoint){printLog(joinPoint,"beforeinstancecall");@After("instanceMethodCall()")publicvoidafterInstanceCall(JoinPointjoinPoint){printLog(joinPoint,"afterinstancecall");privatestaticprivatestaticfinalStaticPartajc$tjp_2=StringTAG="Example";Stringvalue="value";static{列privatestaticvoidajc$preClinit()Factoryfactory=newFactory("Example.java",ajc$tjp_0=factory.makeSJP(JoinPoint.METHOD_CALL,factory.makeMethodSig("1","getValue","com.meituan.hotel.roadmap.Ex");ajc$tjp_1=factory.makeSJP(JoinPoint.METHOD_EXECUTION,factory.makeMethodSig("1","printLog","com.meituan.hotel.roadm");ajc$tjp_2=factory.makeSJP(JoinPoint.METHOD_EXECUTION,factory.makeMethodSig("1","getValue","com.meituan.hotel.roadm");publicclassAjcClosure1extendsAroundClosure{publicAjcClosure1(Object[]objArr){publicObjectrun(Object[]objArr){Object[]objArr2=this.state;Example.printLog_aroundBody0((Example)objArr2[0],(JoinPoint)objArr2[1]);returnnull;staticfinalvoidprintLog_aroundBody0(Exampleajc$this,JoinPointjoinPoint){JoinPointmakeJP=Factory.makeJP(ajc$tjp_0,ajc$this,ajc$this);tryStringstr=ajc$this.getValue();}finally行Before正的方法体被放在了新的方法中。Before\AfterPointCutJoinPointBefore\AfterPointCutJoinPointBefore\AfterJoinPointAOPstaticfinalvoidprintLog_aroundBody0(Exampleajc$this,JoinPointjoinPoint){JoinPointmakeJP=Factory.makeJP(ajc$tjp_0,ajc$this,ajc$this);tryStringstr=ajc$this.getValue();}finally行publicvoidprintLog()JoinPointmakeJP=Factory.makeJP(ajc$tjp_1,this,LogAspect.aspectOf().InstanceMethodExecutingAround(newAjcClosure1(newObject[]{this,makeJP}).linkClosureAndJoinPoint(publicStringgetValue()JoinPointmakeJP=Factory.makeJP(ajc$tjp_2,this,this);return(String)LogAspect.InstanceMethodExecutingAround(newAjcClosure3(newObject[]{this,Around为Around为printLogXXX_aroundBodyN(args)的方法体被放在了新的方法中。publicvoidprintLog()JoinPointmakeJP=Factory.makeJP(ajc$tjp_1,this,joinPceed()调用闭包执行原方法。LogAspect.aspectOf().InstanceMethodExecutingAround(newAjcClosure1(newObject[]{this,列privatestaticvoidajc$preClinit()Factoryfactory=newFactory("Example.java",ajc$tjp_0=factory.makeSJP(JoinPoint.METHOD_CALL,factory.makeMethodSig("1","getValue","com.meituan.hotel.roadmap.Exa");ajc$tjp_1=factory.makeSJP(JoinPoint.METHOD_EXECUTION,factory.makeMethodSig("1","printLog","com.meituan.hotel.roadma");ajc$tjp_2=factory.makeSJP(JoinPoint.METHOD_EXECUTION,factory.makeMethodSig("1","getValue","com.meituan.hotel.roadma");publicJoinPoint.StaticPartmakeSJP(Stringkind,Stringmodifiers,StringmethodName,StringdeclaringType,StringparamTypes,StSignaturesig=this.makeMethodSig(modifiers,methodName,declaringType,paramTypes,paramNames,"",returnType);returnnewJoinPointImpl.StaticPar

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论