Pascal4eg / Java

 Java | Фишки и трюки

Использование аннотаций (Annotations) для улучшения читаемости и обработки кода

Создание аннотации для измерения времени выполнения метода в Java:

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface LogExecutionTime {
}

Данная аннотация @LogExecutionTime позволяет отмечать методы в Java классах, чтобы измерять время выполнения этих методов. Для использования аннотации, следует применить ее к методу, который необходимо измерить:

public class ExampleClass {

    @LogExecutionTime
    public void performTimeConsumingTask() {
        // Выполняем длительную задачу для измерения времени
    }
}

Теперь, можно создать аспект (Aspect) с использованием библиотеки AspectJ или Spring AOP для обработки методов, помеченных аннотацией @LogExecutionTime, и измерить время их выполнения:

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.ProceedingJoinPoint;

@Aspect
public class LogExecutionTimeAspect {

    @Pointcut("@annotation(LogExecutionTime)")
    public void logExecutionTime() {
    }

    @Around("logExecutionTime()")
    public Object logTime(ProceedingJoinPoint joinPoint) throws Throwable {
        long startTime = System.currentTimeMillis();
        Object proceed = joinPoint.proceed();
        long executionTime = System.currentTimeMillis() - startTime;
        System.out.println(joinPoint.getSignature() + " выполнен за " + executionTime + "ms");
        return proceed;
    }
}

Аспект LogExecutionTimeAspect создает возможность измерить время выполнения методов, помеченных аннотацией @LogExecutionTime, путем перехвата вызова метода и расчета времени выполнения. Это может быть очень полезным для оптимизации производительности и анализа кода.