AOP 开发示例

下面是使用 @InsertAtEntry 完成在指定函数入口插桩的示例代码:

package AOP_demo1

import stdx.aspectCJ.*
import std.time.DateTime

@InsertAtEntry[packageName: "AOP_demo1", className: "", methodName: "printCurrentTime", isStatic: false, funcTypeStr: "()->Unit", recursive: false]
public func printCurrentTimeImpl() {
    println("----- ${DateTime.now()} -----")
}

public func printCurrentTime() {
    println("hi")
    println("bye")
}

main() {
    printCurrentTime()
    0
}

linux 平台编译命令:

cjc aop_demo1.cj --plugin=libcollect-aspects.so -o main	// 第一次编译,收集切面
cjc aop_demo1.cj --plugin=libwave-aspects.so -o main	// 第二次编译,织入切面

运行结果可能如下:

----- 2025-06-03T00:00:18.994507-07:00 -----
hi
bye

下面是使用 @InsertAtExit 完成在指定函数退出前插桩的示例代码:

package AOP_demo2

import stdx.aspectCJ.*
import std.time.DateTime

@InsertAtExit[packageName: "AOP_demo1", className: "", methodName: "printCurrentTime", isStatic: false, funcTypeStr: "()->std.core:String", recursive: false]
public func printCurrentTimeImpl() {
    println("----- ${DateTime.now()} -----")
}

public func printCurrentTime() {
    println("hi")
    println("bye")
    "done"
}

main() {
    println(printCurrentTime())
    0
}

linux 平台编译命令:

cjc aop_demo2.cj --plugin=libcollect-aspects.so -o main	// 第一次编译,收集切面
cjc aop_demo2.cj --plugin=libwave-aspects.so -o main	// 第二次编译,织入切面

运行结果可能如下:

hi
bye
----- 2025-06-03T00:04:59.996469-07:00 -----
done

下面是使用 @ReplaceFuncBody 完成替换指定函数函数体的示例代码:

package AOP_demo2

import stdx.aspectCJ.*
import std.time.DateTime

@ReplaceFuncBody[packageName: "AOP_demo1", className: "", methodName: "printCurrentTime", isStatic: false, recursive: false]
public func printCurrentTimeImpl(original: (String)->String) {
    println("----- ${DateTime.now()} -----")
    println(original("abc"))
    println("----- end -----")
    "def"
}

public func printCurrentTime(x: String): String {
    println(x)
    "456"
}

main() {
    println(printCurrentTime("123"))
    0
}

linux 平台编译命令:

cjc aop_demo2.cj --plugin=libcollect-aspects.so -o main	// 第一次编译,收集切面
cjc aop_demo2.cj --plugin=libwave-aspects.so -o main	// 第二次编译,织入切面

运行结果可能如下:

----- 2025-06-03T00:04:59.996469-07:00 -----
abc
456
----- end -----
def