代码之家  ›  专栏  ›  技术社区  ›  user3139545

是否可以使用AOP/AspectJ来影响StringBuilder

  •  1
  • user3139545  · 技术社区  · 5 年前

    我可以使用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 回复  |  直到 5 年前
        1
  •  0
  •   dreamcrash    5 年前

    是的,你可以。我不熟悉您当前使用的语法。但是对于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)"