我可以使用AOP强制每次使用StringBuilder时,第一个插入的符号为!!
。
因此,如果下面的代码在我的项目中的任何地方:
String sb = new StringBuilder().append("22").toString();
sb
实际上是!!22
我有的示例更关注日志记录:
@Component
@Aspect
class LoggingAspect {
private final Log log = LogFactory.getLog(getClass());
@Around("execution( * com.example..*.*(..) )")
public Object log(ProceedingJoinPoint pjp) throws Throwable {
this.log.info("before " + pjp.toString());
Object object = pjp.proceed();
this.log.info("after " + pjp.toString());
}
}
我遇到的问题是,是否甚至有可能为我的问题定义这样的联接点?
答案 0 :(得分:0)
是的,可以。我不熟悉您当前使用的语法。但是使用AspectJ将会是这样:
public aspect InterceptStringBuilders {
StringBuilder around(StringBuilder target) :
call(public StringBuilder append(String)) &&
!within(InterceptStringBuilders) &&
target(target)
{
if(target.length() == 0)
{
target.append("!!");
}
else if(target.length() == 1 || target.charAt(0) != '!' || target.charAt(1) != '!')
{
target.insert(0, "!!");
}
return proceed(target);
}
}
连接点为public StringBuilder append(String)
,您需要切入点target
来公开StringBuilder,以便您可以强制其以“ !!”开头。此外,您还需要切入点!within(interceptStringBuilders)
,以确保您不截取方面本身对Stringbuilder的调用。
我猜您使用的语法类似于:
"call(public StringBuilder append(String) && !within(LoggingAspect) && target(StringBuilder)"