覆盖 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!
瞧瞧!
我有一个方面拦截日志记录方法。该日志记录方法是一种以一个对象作为参数的简单方法:
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!
瞧瞧!