Я в настоящее время использую slf4j сверху log4j для входа. Я хотел бы автоволшебно зарегистрировать любое использование устаревшего метода (аннотируемый стандартом @Deprecated аннотация) в моем коде.
Там какой-либо простой способ состоит в том, чтобы сделать это?
Если вы хотите регистрировать каждое использование, вам, вероятно, придется использовать 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 в производственном режиме.
Я не могу придумать простой способ сделать это, но вы можете использовать инструмент обработки аннотаций для создания кода, который регистрирует использование каждого устаревшего метода.
Думаю, вам будет жаль, если вы сделаете это во время выполнения. Конечно, вы можете использовать Aspect4J, чтобы добавить AOP pointcut к каждому методу, который ищет аннотации; но стоимость производительности будет высокой.
Вы можете, но это будет сложно. Единственное решение AFAIK для "обнаружения" вызовов методов - это использование AOP. В вашем случае вы можете написать аспект, который проверяет каждый вызов метода, проверяет, не устарел ли он, и регистрирует их.
Если вы используете spring, вы можете начать http://static.springsource.org/spring/docs/2.5.x/reference/aop.html
Пожалуйста, имейте в виду, что AOP имеет последствия для производительности и должен использоваться только после тщательного рассмотрения. Возможно, вы можете иметь флаг, который включает эту возможность в dev/qa окружении и отключает их в PROD