HarmonyOS AOP切面拦截有没有类似自定义注解的方式

例如点击事件的登录拦截,当未登录时,点击后跳转到登录页。在HarmonyOS中目前根据API只能调用 util.Aspect.addBefore 来为每方法增加登录判断,感觉还是不够便捷。

HarmonyOS
2024-12-23 15:45:38
浏览
收藏 0
回答 1
回答 1
按赞同
/
按时间
aquaa

目前暂不支持AOP这种方式,可以参考HarmonyOS提供运行时AOP的能力Aspect类用于封装提供切面能力(Aspect Oriented Programming简写AOP)的接口,这些接口可以用来对类方法进行前后插桩或者替换实现, 参考如下API文档:

https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-util-V5#addbefore11

系统提供如下接口,支持运行时AOP的能力:

class Aspect {
  static addBefore(targetClass: Object, methodName: string, isStatic: boolean, before: Function): void;
  static addAfter(targetClass: Object, methodName: string, isStatic: boolean, after: Function): void;
  static replace(targetClass: Object, methodName: string, isStatic: boolean, instead: Function): void;
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

这三个接口可以分别可以对方法做执行前插桩、执行后插桩、替换方法实现。

参考示例:

自定义类TestA

export class TestA {
  data: string = 'testA'

  printData(arg: string) {
    console.log('执行原始方法逻辑');
    console.log("data is " + this.data);
    console.log("arg is " + arg)
    console.log('原始方法执行完毕');
  }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

利用aop对原方法进行插粧

build() {
  Row() {
    Column() {
      Button("调用方法")
        .fontSize(50)
        .fontWeight(FontWeight.Bold)
        .onClick(() => {
          a.printData('a1')
        })
      Button("对方法执行前后进行插粧")
        .fontSize(50)
        .fontWeight(FontWeight.Bold)
        .onClick(() => {
          //在方法执行前插粧
          util.Aspect.addBefore(TestA, 'printData', false, (instance: TestA, arg: string): void => {
            console.log("执行addBefore逻辑----------");
          })
          //在方法执行后插粧
          util.Aspect.addAfter(TestA, 'printData', false, (instance: TestA, arg: string): void => {
            console.log("执行addAfter逻辑----------");
          })
        })
      Button("替换原始方法")
        .fontSize(50)
        .fontWeight(FontWeight.Bold)
        .onClick(() => {
          //替换原始方法
          util.Aspect.replace(TestA, 'printData', false, (instance: TestA, arg: string): void => {
            console.log("原始方法已被替换,不在执行,替换后方法直接打印传入参数,传入的参数为 " + arg);
          })
        })
    }
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
分享
微博
QQ
微信
回复
2024-12-23 17:51:39
相关问题
HarmonyOS 有没有类似Canvas自定义view
1054浏览 • 1回复 待解决
HarmonyOS 如何自定义注解
1271浏览 • 1回复 待解决
HarmonyOS 自定义注解实现方案
955浏览 • 1回复 待解决
HarmonyOS ArkTS是否支持自定义注解
988浏览 • 1回复 待解决
HarmonyOS 有没有自定义刻度尺组件?
1028浏览 • 1回复 待解决
请问鸿蒙中有没有@Keep注解
9422浏览 • 2回复 待解决
HarmonyOS router有没有拦截器?
585浏览 • 1回复 待解决
HarmonyOS 有没有类似clipChildren属性
797浏览 • 1回复 待解决
HarmonyOS 有没有类似scrollview组件
1102浏览 • 1回复 待解决
HarmonyOS 有没有类似Pair参数
806浏览 • 1回复 待解决
HarmonyOS有没有类似tint属性
961浏览 • 1回复 待解决
鸿蒙有没有类似carplay应用
8663浏览 • 1回复 待解决