在AspectJ中覆盖方法参数

时间:2016-09-02 10:04:41

标签: java aspectj pointcut

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

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错误。

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

您可以使用如下:

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

答案 2 :(得分:0)

我认为您的班级名称不是包test中的小写com,而是包Logger中的真实班级名称com.test,好吗?

使用main方法的示例记录器类:

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!

Etvoilà!