Как добавить метод в класс, где имя метода основано на существующем аннотированном методе в AspectJ? - PullRequest
2 голосов
/ 20 июля 2011

Рассмотрим этот код:

class DatabaseCommands {

    @Privilege(ADMIN)
    public void delete(Something thingToDelete, User currentUser) {
        /* ... */
    }
}

В настоящее время в этот метод встроена проверка доступа, чтобы проверить, обладает ли currentUser необходимыми правами для выполнения команды базы данных (и выдает исключение, если нет).

Что мне нужно добавить в мой файл AspectJ, чтобы новый метод

public boolean deleteAllowed(Something thingToDelete, User currentUser)

добавляется в класс с теми же проверками доступа, но без выполнения команды?

Этот вариант использования, похоже, похож на тот, который используется для добавления методов получения / установки к полям, например

class Foo {
    @Getter @Setter
    String name = ""
}

1 Ответ

4 голосов
/ 26 июля 2011

Насколько мне известно, к сожалению, невозможно добавить методы (называемые Inter Type объявлениями в AspectJ) с использованием динамических подписей, поэтому нет способа создать методы, основанные на именах или параметрах другого метода.

@ Setter @Getter реализован не с использованием AspectJ, а с использованием других методов. Spring Roo будет на самом деле проверять исходный код и генерировать исходный код для аспектов, которые затем будут скомпилированы и применены к исходным классам. Project Lombok и другие используют непосредственно ASM, BCEL или APT для инструментальной обработки Java-байт-кода. ASM - это тот же инструментарий, который используется самим AspectJ для изменения (Weave in AspectJ) терминов .class-файлов, но при непосредственном использовании он гораздо более гибкий (и гораздо более сложный), чем AspectJ. APT - это инструмент Sun для обработки аннотаций, который, поскольку Java 6 «встроен» в компилятор Java. Он может использоваться для «перехвата» момента, когда Javac компилирует метод или класс, имеющий определенные аннотации, и может использоваться для «внедрения» нового кода, включая пару «получатель / установщик» или другой новый метод.

...