Как я могу автоматически регистрировать использование любого метода @Deprecated annoted в Java? - PullRequest
5 голосов
/ 04 марта 2010

В настоящее время я использую slf4j поверх log4j для ведения журнала.Я хотел бы автоматически регистрировать любое использование устаревшего метода (аннотированного стандартной аннотацией @Deprecated) в моем коде.

Есть ли простой способ сделать это?

Ответы [ 4 ]

4 голосов
/ 04 марта 2010

Если вы хотите регистрировать каждое использование, вам, вероятно, придется использовать 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 голос
/ 04 марта 2010

Я не могу придумать простой способ сделать это, но вы можете использовать инструмент обработки аннотаций для генерации кода, который регистрирует использование каждого устаревшего метода.

0 голосов
/ 04 марта 2010

Можно, но это будет сложно. Единственное решение AFAIK для «обнаружения» вызовов методов - это использование AOP. В вашем случае вы можете написать аспект, который проверяет каждый вызов метода и проверяет, не устарел ли он, и регистрирует их.

Если вы используете пружину, вы можете начать http://static.springsource.org/spring/docs/2.5.x/reference/aop.html

Обращаем ваше внимание, что AOP влияет на производительность и должен использоваться только после тщательного рассмотрения. Возможно, у вас есть флаг, который включает эту функцию в среде dev / qa и отключает их в PROD

0 голосов
/ 04 марта 2010

Я думаю, вы бы пожалели, если бы сделали это во время выполнения. Конечно, вы можете использовать Aspect4J для наложения точки AOP на каждый метод, который ищет аннотации; но стоимость исполнения будет высокой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...