Несмотря на все высказывания, вы можете сделать это. Java-аннотации не могут изменить исходные файлы или файлы классов, с которыми они работают, поэтому вы можете выбрать следующие варианты:
1) Используйте суперкласс. Процессор аннотаций может генерировать суперкласс, который умножается на абстрактный метод. Ваш реальный класс реализует этот метод. Недостатком является то, что метод, который вы хотите время, должен быть переименован, чтобы суперкласс мог обеспечить реализацию. Результат может выглядеть следующим образом
@BenchmarkMe( extend="MySuperClass" )
public class MyClass extends BenchmarkMyClass {
public void normalMethod() { ... }
public void bench_myMethod() { ... }
}
и процесс аннотации сгенерирует:
public class BenchmarkMyClass extends MySuperClass {
public abstract void bench_myMethod();
public void myMethod() {
benchmarkStart();
try {
bench_myMethod();
} finally { benchmarkStop(); }
}
}
Используя соглашение об именах, чтобы указать, какие методы должны быть синхронизированы в качестве префикса "bench_", был использован в моем примере.
2) Используйте ClassFileTranformer, а также аннотацию
Подход заключается в создании аннотации времени выполнения, которую можно использовать для обозначения методов, которые вас интересуют во времени. Во время выполнения в командной строке указывается ClassFileTransformer, который преобразует байтовый код для вставки временного кода.
Если вам не нравится работать с байт-кодом, лучше использовать AOP, но это возможно IS .