日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

android aspectj 参数,AspectJ在Android中的使用

發(fā)布時間:2023/12/20 Android 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android aspectj 参数,AspectJ在Android中的使用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、AOP

全稱“Aspect Oriented Programming”,面向切面編程,由于面向?qū)ο蟮乃枷胍蟾邇?nèi)聚,低耦合的風(fēng)格,使模塊代碼間的可見性變差,對于埋點,日志輸出等需求,就會變的十分復(fù)雜,如果手動編寫代碼,入侵性很大,不利于擴展,AOP應(yīng)運而生。

二、使用場景

當(dāng)我們需要在某個方法運行前和運行后做一些處理時,便可使用AOP技術(shù)。具體有:

統(tǒng)計埋點

日志打印/打點

數(shù)據(jù)校驗

行為攔截

性能監(jiān)控

動態(tài)權(quán)限控制

***三、環(huán)境配置

我們以Android工程+官方的AspectJ為例

1.項目根目錄build.gradle配置

dependencies {

classpath 'org.aspectj:aspectjtools:1.8.9'

classpath 'org.aspectj:aspectjweaver:1.8.9'

}

2.具體使用AspectJ的工程build.gradle中配置

dependencies {

implementation 'org.aspectj:aspectjrt:1.8.13'

}

import org.aspectj.bridge.IMessage

import org.aspectj.bridge.MessageHandler

import org.aspectj.tools.ajc.Main

final def log = project.logger

final def variants = project.android.applicationVariants

variants.all { variant ->

if (!variant.buildType.isDebuggable()) {

log.debug("Skipping non-debuggable build type '${variant.buildType.name}'.")

return;

}

JavaCompile javaCompile = variant.javaCompile

javaCompile.doLast {

String[] args = ["-showWeaveInfo",

"-1.8",

"-inpath", javaCompile.destinationDir.toString(),

"-aspectpath", javaCompile.classpath.asPath,

"-d", javaCompile.destinationDir.toString(),

"-classpath", javaCompile.classpath.asPath,

"-bootclasspath", project.android.bootClasspath.join(File.pathSeparator)]

log.debug "ajc args: " + Arrays.toString(args)

MessageHandler handler = new MessageHandler(true);

new Main().run(args, handler);

for (IMessage message : handler.getMessages(null, true)) {

switch (message.getKind()) {

case IMessage.ABORT:

case IMessage.ERROR:

case IMessage.FAIL:

log.error message.message, message.thrown

break;

case IMessage.WARNING:

log.warn message.message, message.thrown

break;

case IMessage.INFO:

log.info message.message, message.thrown

break;

case IMessage.DEBUG:

log.debug message.message, message.thrown

break;

}

}

}

}

以上配置完成后,便可以項目中進(jìn)行使用了,當(dāng)然,除了官方提供的,還有其他三方的aspectJ框架供我們使用,如https://github.com/HujiangTechnology/gradle_plugin_android_aspectjx,其配置與上面的略有不同,開發(fā)者根據(jù)自己選擇的具體框架進(jìn)行相應(yīng)的配置

三、代碼實例

public class AspectJActivity extends AppCompatActivity {

private String TAG = "AspectJActivity";

@Override

protected void onCreate(@Nullable Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_aspect);

Log.i(TAG,hashCode()+"");

aspectTest();//以普通方法進(jìn)行aspectJ處理

aspectTestAnn();//以注解方式進(jìn)行

}

public void aspectTest() {

Log.i(TAG, "aspect test");

}

@AspectAnn

public void aspectTestAnn() {

Log.i(TAG, "aspect by annoation test");

}

}

要求,在運行aspectTest()前先打印一個信息,在運行aspectTestAnn后也打印一個信息,兩者最大的區(qū)別在于,前者使用類名和方法名來實現(xiàn)切面,而后者則使用注解來實現(xiàn),在實際開發(fā)中,用注解來實現(xiàn)切面的場景更多一些。

自定義注解AspectAnn

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.METHOD)

public @interface AspectAnn {

}

關(guān)鍵的切面處理類 AspectUtil

@Aspect

public class AspectUtil {

@Pointcut

("execution(* com.game.xiangxuemytest.aspectj.AspectJActivity.aspectTest(..))")

public void pointActionMethod() {}

@Before("pointActionMethod()")

public void testBefore(){

Log.i("AspectJActivity","AspectUtil method1 Before");

}

// @Pointcut

// ("@annotation(com.game.xiangxuemytest.aspectj.AspectAnn)")

// public void pointActionMethod2(AspectAnn ann) {

//

// }

@Pointcut

("execution(@com.game.xiangxuemytest.aspectj.AspectAnn * *(..))")

public void pointActionMethod2() {

}

@After("pointActionMethod2()")

public void testAfter(JoinPoint point) {

Log.i("AspectJActivity", "AspectUtil method2 After");

}

}

@Aspect 標(biāo)志切面的處理類

@Pointcut標(biāo)志切點是誰,后面跟符合切點的規(guī)則。

1> 包名+類名+方法名來確定切點規(guī)則:

pointActionMethod()上,com.game.xiangxuemytest.aspectj.AspectJActivity.aspectTest(..)。其中第一個 * 號表示返回值可為任意類型,括號內(nèi)表示參數(shù)列表, .. 表示匹配任意個參數(shù),參數(shù)類型為任何類型

2>以注解來確定切點規(guī)則的:

方法 pointActionMethod2(),@com.game.xiangxuemytest.aspectj.AspectAnn * (..)),注意兩個 之間有個空格,和方式1略有不同。

@Before

切入代碼運行在目標(biāo)代碼前,同理還有 @After,@Around等,表示目標(biāo)后,及目標(biāo)前+后。其目的表示切入點運行的代碼。同時,由于可以存在多個切入點,所以該注解后要跟上切入點的方法名,

execution,這個我理解的為實現(xiàn)切入的方式吧。另外還有一個call,隨后我們可以根據(jù).class文件看一下兩者的區(qū)別。

運行結(jié)果:

AspectUtil method1 Before

aspect test

aspect by annoation test

AspectUtil method2 After

四、實現(xiàn)原理

通過Gradle Transform,在class文件生成后至dex文件生成前,遍歷并匹配所有符合AspectJ文件中聲明的切點,更改我們原有的.class文件,將事先聲明好的代碼在切點前后織入。因此,這個增加我們的編譯時間,下面來看一下上述代碼的最終的.class文件

image.png

為了方便后面的問題,我們以截圖的方式顯示,注意紅框部分。從.class文件可以看到,我們原有的方法前或后,增加了新的代碼。從而實現(xiàn)了我們想要的切面功能。

五、call與execution

上面我們說了,這兩個會影響切面實現(xiàn)的方式,我們把execution改為call后,看一下其.class

image.png

比較兩者,可以發(fā)現(xiàn),call的方式,不會改變原有的代碼,而是在目標(biāo)方法的調(diào)用前后,進(jìn)行了相應(yīng)的新代碼的插入。

以上是個人對AspecJ的一些入門理解,希望能對小伙伴們有所幫助。

總結(jié)

以上是生活随笔為你收集整理的android aspectj 参数,AspectJ在Android中的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美 亚洲 一区 | 在线观看视频福利 | 男女污污软件 | 亚洲欧美bt | 波多野结衣免费看 | 日本乱码一区二区 | xxxxxx欧美 | 香港三日本8a三级少妇三级99 | 国产精品一区二 | 日韩黄色一级视频 | 欧美日韩国产免费 | 久久精品伦理 | 台湾佬美性中文网 | 国产偷自拍视频 | jizz在线观看视频 | 九九热视频免费 | 国产在线不卡一区 | av免费网址在线观看 | 日韩网站免费 | 99精品人妻无码专区在线视频区 | 中文字幕欧美专区 | 国产高清视频在线免费观看 | 午夜网站在线观看 | 加勒比视频在线观看 | 丁香花电影在线观看免费高清 | 国产精品高清在线观看 | 办公室荡乳欲伦交换bd电影 | 日本免费久久 | 欧美少妇xx | 久久爱成人| 国内一区二区视频 | 蜜桃视频久久一区免费观看入口 | 在线观看黄色免费视频 | 中文字幕福利视频 | 国产另类ts人妖一区二区 | 亚洲精品午夜国产va久久成人 | 97爱视频| 91国偷自产一区二区三区女王 | 久久黄色大片 | 国产一级片a | 麻豆视频在线免费看 | 中文字幕在线观看亚洲 | 极品淫少妇| 秋霞成人 | www婷婷av久久久影片 | 成人激情视频 | 91久久在线 | 夜夜嗨av一区二区三区 | av高清在线| 免费观看在线高清 | 国产精品扒开腿做爽爽爽视频 | 亚洲aⅴ在线观看 | 国产精品久久久久久久成人午夜 | 国产成人精品无码播放 | 日本老太婆做爰视频 | 国产一区二区片 | 精品国产午夜 | 2019天天操 | 久久色播 | 日韩精品――中文字幕 | 精品视频中文字幕 | 国产精品99久久久久久久女警 | 天天国产视频 | www.jizzcom| a在线免费观看 | 操操网站| 涩涩屋污 | 日韩城人免费 | 女性向av免费网站 | 日韩精品电影一区 | 精品久久国产字幕高潮 | 超级砰砰砰97免费观看最新一期 | 九九精品在线观看视频 | 最新在线中文字幕 | 精品国产乱码久久久久久蜜臀 | 综合色导航| 黄色工厂在线观看 | avt天堂网 | 日韩视频第一页 | 久久精品在线 | 亚洲伦理影院 | 国产区第一页 | 日韩免费在线观看 | 色婷婷九月| 欧美日韩国产91 | a级黄色小视频 | 亚洲69av | 91视频xxx | 97人妻一区二区精品免费视频 | www.色网站 | 青青草国产在线 | 激情六月| 亚洲精品一二三 | 青青草十七色 | 日本天堂一区 | 欧美黑人疯狂性受xxxxx野外 | 成人片黄网站色大片免费毛片 | 六月丁香婷婷激情 | 国产色无码精品视频国产 |