Aspect工具装饰器的使用示例

目前提供的@ohos.util工具中的Aspect 切面能力,示例比较简单,不能快速或完全了解如何使用,仅在当前类使用,能否提供配合装饰器使用的例子。

HarmonyOS
2024-04-28 23:44:31
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
JKings

可以参考借鉴ts生态的一些AOP实践,比如利用装饰器实现AOP

https://juejin.cn/post/71053264915330498632. 一些ts的aop例子https://github.com/nullcc/ts-aop-example3. ts-aop的三方库https://www.npmjs.com/package/ts-aspect

注解可以 import Reflect-metadata鸿蒙的Aspect 只支持类方法的插装。以下是示例在EntryAbility.ets 文件下对 EntryAbility 进行插装

1、 对类 
util.Aspect.addBefore(EntryAbility, “onCreate”, false, (instance: EntryAbility, want: Want): void => { 
  let params = want.parameters as Record<string, Object>; 
  console.error('testtag 获取pid: '+params[‘ohos.aafwk.param.callerPid’]); 
}); 
 
2、 异步 
 
class Test { 
  static data:string = ‘initData’ 
  static async printData(arg: string) { // 异步方法 
    console.log(‘execute original printData’); 
    console.log('Test.data is ’ + Test.data); 
    console.log(arg); 
    return 0; 
  } 
} 
// 插桩 
util.Aspect.addBefore(Test, “printData”, true, 
(classObj: Object, arg: string): void => { 
  console.log(“execute before”); 
  Reflect.set(classObj, “data”, “dataChangedByBefore”); 
  console.log("arg is " + arg); 
} 
); 
 
Test.printData(“m1”).then((res) => { 
  console.log("res = " + res.toString()); 
  console.log("Test.data = " + Test.data); 
})

关于自定义装饰器,ArkTS支持TS5.0之前的TS装饰器语法,,如果在ets文件中定义装饰器,则需要同时满足ArkTS的语法规则,比如不能使用any等。

判断类型可以参照 util.types8当前只支持对类的函数进行插桩,不支持自定义装饰器,字节码插桩,UI组件插桩等

分享
微博
QQ
微信
回复
2024-04-29 16:03:47
相关问题
状态装饰 ui不刷新问题
746浏览 • 1回复 待解决
是否支持自定义装饰
332浏览 • 1回复 待解决
ArkTS是否支持自定义装饰
145浏览 • 1回复 待解决
使用华为账号服务登录示例代码
156浏览 • 1回复 待解决
使用华为支付示例代码吗
143浏览 • 1回复 待解决
xComponet示例代码不能使用
152浏览 • 1回复 待解决
如何使用Charles工具抓包
490浏览 • 1回复 待解决
如何申请使用DevEco Studio工具
7594浏览 • 2回复 待解决
无法正常使用开发工具Pycharm
28512浏览 • 47回复 已解决
无法使用DevEco Studio预览
4458浏览 • 1回复 待解决