【问题标题】:How can I automatically log use of any @Deprecated annoted method in Java?如何自动记录 Java 中任何 @Deprecated 注释方法的使用?
【发布时间】:2010-03-04 16:19:39
【问题描述】:

我目前在 log4j 之上使用 slf4j 进行日志记录。我想在我的代码中自动记录对已弃用方法(使用标准 @Deprecated 注释进行注释)的任何使用。

有什么简单的方法吗?

【问题讨论】:

  • 有什么原因不能在编译时完成吗?好的,您可能会发现一些实例被引用但从未实际使用过,但您应该清楚地了解(可能)调用了哪些不推荐使用的方法。
  • 这可以在编译时完成,但解决方案必须很容易做到,因为可能不是我会做这项工作:) 我们使用的是 Maven2,我想我们可以使用 APT 来执行此操作,我还不知道如何将 APT 与 Maven 一起使用。我读过 APT 在 Javac 中使用 JDK6,但我公司的大多数开发人员现在都在使用 JDK5 来构建他们的程序,所以它可能不是最简单的解决方案。
  • 我可以想到一种可能有用的情况,即在 @RestController 中调用已弃用的路由。但我认为在弃用该方法的同时手动添加WARN 级别日志事件会更容易。

标签: java logging annotations


【解决方案1】:

如果您想记录每次使用,您可能必须使用AOP。如果有简单的方法可以做到这一点,这取决于您使用的框架。这就是它在Spring 中的样子:

public class DeprecatedLoggerAdvice implements MethodInterceptor
{
    private Logger log = LoggerFactory.getLogger(this.getClass());

    @Override
    public Object invoke(MethodInvocation invocation) throws Throwable
    {
        Methode method = invocation.getMethod();
        Annotation[] annotations = method.getAnnotations();
        boolean isDeprecated = // Check it annotations has the deprecated one in here
        if(isDeprecated)
        {
            log.warn("Called deprecated method {}", method.getName());
        }
        invocation.proceed();
    }
}

尽管如前所述,这对性能不利。如果您在应用程序中使用它,您应该将该方法与涵盖大部分代码的单元测试结合使用。然后您可以记录并删除已弃用方法的使用,然后在生产模式下禁用 AOP。

【讨论】:

  • 这可以应用于非 Spring bean 吗?我们正在使用 Spring,但是我想在我的实体中弃用一些 getter 和 setter,所以它们本身不是 bean。我相信我们可以在属性中创建一个 Maven 配置文件或一个值,以便在生产模式下删除它
  • 这只能通过编译时编织 (cglib) 实现,这意味着您必须启用 AspectJ 支持。我发现这总是很麻烦,但请查看文档 static.springsource.org/spring/docs/3.0.x/… 了解它的工作原理。
【解决方案2】:

我想不出一种简单的方法来做到这一点,但您可以使用annotation processing tool 来生成记录每个已弃用方法的使用的代码。

【讨论】:

    【解决方案3】:

    如果您在运行时这样做,我想您会很抱歉。当然,您可以使用 Aspect4J 在每个查找注解的方法上放置一个 AOP 切入点;但性能成本会很高。

    【讨论】:

    • 不了解aspect4j,但是使用AspectJ,您可以根据@Deprected 注解定义一个切入点,因此只有那些方法才能应用建议,其他任何内容都不受影响
    【解决方案4】:

    你可以,但它会很艰难。 AFAIK“检测”方法调用的唯一解决方案是使用 AOP。在您的情况下,您可以编写一个方面来检查每个方法调用并检查它是否已被弃用并记录它们。

    如果你使用spring可以启动http://static.springsource.org/spring/docs/2.5.x/reference/aop.html

    请注意,AOP 具有性能影响,只有在仔细考虑后才能使用。也许你可以有一个标志,在 dev/qa 环境中启用此功能并在 PROD 中禁用它们

    【讨论】:

      猜你喜欢
      • 2017-08-03
      • 2020-04-22
      • 2012-09-25
      • 2014-08-25
      • 1970-01-01
      • 2011-11-06
      • 1970-01-01
      • 1970-01-01
      • 2021-10-17
      相关资源
      最近更新 更多