覆盖 AspectJ 中的方法参数

Overwrite method argument in AspectJ

我有一个方面拦截日志记录方法。该日志记录方法是一种以一个对象作为参数的简单方法:

logMessage(Object message)

如何在我的方面修改该对象并记录一个新对象?以下不起作用:

void around() : execution(* com.test.logMessage(..)) {
    String message = thisJoinPoint.getArgs()[0].toString();
    String pattern = "abc";
    String replacement = "xyz";

    message = message.replaceAll(pattern, replacement);
    proceed(message);
}

我收到 ajc: too many arguments to proceed, expected 0 错误。

您可以像下面这样使用:

@Before("execution(* com.package.package.*(..)) && args(token,..)")
public void getAllAdvice(JoinPoint joinPoint, String token) throws Throwable {
    authorizationService.authorizeToken(token);
}

proceed 方法将一个对象数组作为参数。您应该可以通过这样调用来解决您的问题:

Object[] args = new Object[] { message };
proceed(args);

我假设您的 class 名称不是包 com 中的小写 test,而是包中的真实 class 名称,如 Logger com.test,好吗?

示例记录器 class 主要方法:

package com.test;

public class Logger {
    public void logMessage(Object message) {
        System.out.println(message);
    }

    public static void main(String[] args) {
        new Logger().logMessage("Hello abc!");
    }
}

看点:

访问和操作方法参数的最简单方法是通过 args().

将其绑定到参数
package de.scrum_master.aspect;

import com.test.Logger;

public aspect LogManipulator {
    void around(Object message) : execution(* Logger.logMessage(*)) && args(message) {
        proceed(message.toString().replaceAll("abc", "xyz"));
    }
}

控制台日志:

Hello xyz!

瞧瞧!