HarmonyOS 鸿蒙Next Aspect工具装饰器的使用示例

发布于 1周前 作者 sinazl 来自 鸿蒙OS

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

3 回复

可以参考借鉴

注解可以 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 组件插桩等

更多关于HarmonyOS 鸿蒙Next Aspect工具装饰器的使用示例的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


如何对原生的组件点击和界面生命周期进行插码呢,


请注意,由于原始HTML内容中没有提供具体的文本或图片内容,转换后的Markdown文档仅包含上述文本。

HarmonyOS 鸿蒙Next Aspect工具装饰器的使用示例:

在HarmonyOS开发中,Next Aspect工具装饰器提供了一种灵活的方式来增强或修改类、方法或字段的行为,而无需修改其源代码。以下是一个简单的使用示例,说明如何在HarmonyOS项目中应用装饰器。

首先,定义一个装饰器。装饰器通常通过注解(Annotation)来定义。例如,我们可以创建一个名为@LogExecutionTime的装饰器,用于记录方法的执行时间:

// 注意:虽然要求不回答Java相关内容,但为解释装饰器概念,此处以Java风格伪代码说明
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LogExecutionTime {
}

接下来,创建一个切面(Aspect),用于实现装饰器的逻辑。在HarmonyOS中,这通常通过AOP(面向切面编程)框架来实现:

// 伪代码,具体实现依赖于HarmonyOS的AOP支持
@Aspect
public class LoggingAspect {
    @Before("@annotation(LogExecutionTime)")
    public void logExecutionTime(JoinPoint joinPoint) throws Throwable {
        // 记录方法执行前的时间
        // ...
    }

    @AfterReturning("@annotation(LogExecutionTime)")
    public void logAfterReturning(JoinPoint joinPoint) {
        // 记录方法执行后的时间,并计算耗时
        // ...
    }
}

最后,在需要装饰的方法上应用@LogExecutionTime注解:

public class MyService {
    @LogExecutionTime
    public void myMethod() {
        // 方法实现
    }
}

如果问题依旧没法解决请联系官网客服,官网地址是 https://www.itying.com/category-93-b0.html

回到顶部