Можно ли использовать AOP / AspectJ для воздействия на StringBuilder - PullRequest
0 голосов
/ 18 января 2019

Могу ли я использовать 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());
    }
}

У меня проблема в том, можно ли вообще определить такую ​​точку соединения для моей проблемы?

1 Ответ

0 голосов
/ 18 января 2019

Да, вы можете. Я не знаком с синтаксисом, который вы используете в настоящее время. Но с 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)"
...