Aspect工具装饰器的使用示例

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

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

可以参考借鉴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
相关问题
自定义装饰使用问题
781浏览 • 1回复 待解决
应用卡片内部组件能使用装饰吗?
296浏览 • 1回复 待解决
HarmonyOS Aspect能否hook CustomComponent?
194浏览 • 1回复 待解决
装饰 @Styles 和 @Extend
409浏览 • 1回复 待解决
HarmonyOS NodeContainer使用示例
13浏览 • 1回复 待解决
HarmonyOS @Concurrent装饰报错
0浏览 • 1回复 待解决
@Watch装饰回调执行顺序
305浏览 • 1回复 待解决
状态装饰 ui不刷新问题
2456浏览 • 1回复 待解决
@Track装饰有什么作用?
741浏览 • 1回复 待解决