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

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

HarmonyOS
3天前
浏览
收藏 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;
}

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

参考示例:

自定义类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('原始方法执行完毕');
  }
}

利用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);
          })
        })
    }
分享
微博
QQ
微信
回复
3天前
相关问题
HarmonyOS 有没有类似Canvas自定义view
310浏览 • 1回复 待解决
HarmonyOS 如何自定义注解
278浏览 • 1回复 待解决
请问鸿蒙中有没有@Keep注解
8035浏览 • 2回复 待解决
HarmonyOS 有没有类似scrollview组件
341浏览 • 1回复 待解决
HarmonyOS 有没有类似clipChildren属性
39浏览 • 1回复 待解决
鸿蒙有没有类似carplay应用
7941浏览 • 1回复 待解决
鸿蒙有没有类似viewpage组件
7876浏览 • 1回复 已解决
HarmonyOS有没有类似tint属性
48浏览 • 1回复 待解决
HarmonyOS 有没有Toast类似的组件
81浏览 • 1回复 待解决