Могу ли я использовать 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());
}
}
У меня проблема в том, можно ли вообще определить такой точка соединения для моей проблемы?




Да, ты можешь. Я не знаком с синтаксисом, который вы сейчас используете. Но с 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), и вам нужен pointcut target, чтобы выставить StringBuilder, чтобы вы могли заставить его начинаться с «!!». Кроме того, вам также нужен pointcut !within(interceptStringBuilders), чтобы гарантировать, что вы не перехватываете вызовы Stringbuilder из самого аспекта.
Я предполагаю, что с синтаксисом, который вы используете, будет что-то похожее на:
"call(public StringBuilder append(String) && !within(LoggingAspect) && target(StringBuilder)"
Работающий пример:
Main.java:
public class Main {
public static void main(String[] args) {
System.out.println(new StringBuilder().append("22").toString());
System.out.println(new StringBuilder().append("!2").append("!2").toString());
System.out.println(new StringBuilder().append("!!2").append("!!2").toString());
}
}
InterceptStringBuilders.aj:
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);
}
}
Вывод:
!!22
!!!2!2
!!!!2!!2