Можно ли аннотировать Java-метод для добавления кода до и после основного кода в методе?

1

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

Скажем, например, у меня есть код, который выглядит так:

public class AnnotationHelp {

    public static void exampleMethod() {
        System.out.println("example method");
    }

}

Поэтому вызов AnnotationHelp.exampleMethod() должен печатать example method.

Я хочу что-то вроде этого:

public class AnnotationHelp {

    @MysteryAnnotation
    public static void exampleMethod() {
        System.out.println("example method");
    }

}

Вызов этого, мы надеемся, вызовет код до и после exampleMethod основного кода, что приведет к чему-то вроде:

Printed before main code example method Printed after main code

Возможно, я ошибаюсь в этом, но суть в том, что я хочу иметь возможность быстро добавлять код до и после нескольких методов (30+), и я думаю, что аннотации - это способ сделать это, но я не знаю как.

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

  • 2
    Этот метод называется «Аспектно-ориентированное программирование», АОП
  • 0
    Я знаю, что вы спрашиваете о Java, в частности, так что это не совсем ответ на ваш вопрос, но вы знаете, Groovy позволяет делать такие вещи с преобразованиями AST, поэтому код добавляется во время компиляции без специального перехвата во время выполнения участвует. Преобразования AST предлагают все виды возможностей. Полученный код полностью совместим с Java. Java вызывает затронутые методы, как и любой другой метод, и никакой специальный контейнер не требуется.
Теги:

2 ответа

2
Лучший ответ

То, что вы ищете, - это Aspect Oriented Programming (AOP).

Он не поддерживается из коробки на Java, для этого вам необходимо использовать сторонние библиотеки.

Наиболее распространенной основой для этого является Spring

  • 0
    И наиболее очевидной основой будет AspectJ
0

Альтернативой полному решению AOP, таким как AspectJ, которое может привести к жесткому поддержанию кода, поскольку оно почти кажется слишком "мощным", подходит для легкого подхода, такого как захват Java EE-перехватчиков.

Вам в основном нужен контейнер, который вызывает методы. Если метод аннотируется аннотацией перехватчика, вызовите соответствующий код до и/или после выполнения вызова метода.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню