当前位置: 首页 > 知识库问答 >
问题:

为私人方法编织

高恺
2023-03-14

我有一个AspectJ编织注释,它适用于公共方法,但私有方法被忽略了。此方法的目的是简单地记录运行函数所用的时间。

@Aspect
@Slf4j
public class TimedLogAspect {

    @Pointcut("@annotation(timedLogVar)")
    public void annotationPointCutDefinition(TimedLog timedLogVar) {}

    @Pointcut("execution(* *(..))")
    public void atExecution() {}

    @Around(value = "annotationPointCutDefinition(timedLogVar) && atExecution()", argNames = "joinPoint,timedLogVar")
    public Object around(ProceedingJoinPoint joinPoint, TimedLog timedLogVar) throws Throwable {
        Stopwatch stopwatch = Stopwatch.createStarted();
        Object returnValue = joinPoint.proceed();
        stopwatch.stop();

        MessageBuilder messageBuilder = new MessageBuilder(joinPoint.toShortString(), stopwatch.elapsed(TimeUnit.MILLISECONDS))
                .attachMessage(timedLogVar.message())
                .attachMethodArgs(timedLogVar.shouldAttachMethodArgs(), Stream.of(joinPoint.getArgs()).collect(Collectors.toList()))
                .attachReturnValue(timedLogVar.shouldAttachReturnValue(), returnValue);

        log.info(messageBuilder.build(), messageBuilder.getArgs().toArray());

        return returnValue;
    }
}

这是实际的接口:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface TimedLog {
    boolean shouldAttachMethodArgs() default false;
    boolean shouldAttachReturnValue() default false;
    String message() default "";
}

我已经看到了很多答案,在执行部分的第一个*之前添加Private,我看到了注释不支持的特权,并且我使用的是没有SpringAOP的AeyJ。

有什么想法吗?

共有1个答案

岳奇逸
2023-03-14

答案很简单:使用原生AeyJ语法。你自己提到的。你甚至说你使用完整的AeyJ,而不是Spring AOP。所以切换应该不是问题。

你有很多优点:

  • 更强大(正如您所注意到的,注释语法中没有一些功能),

基于注释的语法IMO非常难阅读,所有内容都在注释参数内的单个字符串中。我只有在没有其他选择或在这里回答有关它的问题时才使用它。

 类似资料:
  • 我有以下场景: 我想在测试中覆盖公共方法methodA()的catch块。我不想更改私有方法的可见性。是否有任何方法可以使用EasyMock实现私有方法的部分模拟?或者有没有办法改变Junit类中私有方法的行为,以便在不使用mocking的情况下抛出异常? 提前谢谢。

  • 问题内容: 将私有方法定型是否有好处?这样会提高性能吗? 我认为“私有最终”没有多大意义,因为私有方法不能被覆盖。因此,方法查找应该像使用final时一样高效。 (如果可能)将私有助手方法设为静态会更好吗? 最好使用什么? 问题答案: 添加方法不会提高Sun HotSpot的性能。HotSpot会在可能添加的地方注意到该方法永远不会被覆盖,因此请一视同仁。 在Java中,方法是非虚拟的。您不能覆盖

  • 本文向大家介绍centos7搭建docker私人仓库的方法(kubernetes),包括了centos7搭建docker私人仓库的方法(kubernetes)的使用技巧和注意事项,需要的朋友参考一下 我们平时镜像都是习惯于放在公共仓库的,比如Dockerhub, Daocloud。但在企业里,我们经常会需要搭建公司自己的镜像仓库。 这篇文章讲解如何用docker提供的registry镜像来搭建自己

  • 在github文档中找不到任何东西,在这里也找不到。但是我想知道是否可以有一个用于名为的私有存储库,该存储库可以访问,只有一个人可以访问存储库本身。 我记得曾经读过一些关于github页面总是公开的东西,但似乎再也找不到了。

  • 为什么不能正确编译?为了测试它,我添加了main方法行,但是我得到了很多错误,说私有构造函数和公共构造函数都是表达式的非法开头,还说它们不是语句。它还要求我在我认为不必要的地方添加分号,因为分号是方法的开始。我不希望任何人为我重新输入代码,但至少有人能给我指出正确的方向,告诉我哪里出了问题吗?