如何在Java中自动记录任何@Deprecated annoted方法的使用?

时间:2010-03-04 16:19:39

标签: java logging annotations

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

有没有简单的方法可以做到这一点?

4 个答案:

答案 0 :(得分:4)

如果您想记录每次使用,您可能需要使用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。

答案 1 :(得分:1)

我无法想到简单方法,但您可以使用annotation processing tool生成记录每个弃用方法使用情况的代码。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

如果您使用弹簧,则可以启动http://static.springsource.org/spring/docs/2.5.x/reference/aop.html

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