Можно ли использовать аннотации для внедрения кода? - PullRequest
9 голосов
/ 16 июля 2009

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

Я хочу знать, возможно ли использовать аннотации для внедрения кода во время компиляции ваших классов. Классический пример - создание метода получения и установки для членов вашего объекта. Это не совсем то, что мне нужно, но служит иллюстрацией основной идеи.

Теперь в Интернете я получаю основной ответ - нет, но этот парень сделал это:

текст ссылки

Кто-нибудь знает, как он делает то, что он делает (и если он действительно делает то, что он говорит, он делает)?

Главное, что он не использует процессор аннотаций для генерации нового Java-файла для компиляции. Эту технику я знаю и не буду работать для наших целей.

Спасибо

Ответы [ 4 ]

5 голосов
/ 16 июля 2009

Не поддерживается изменение кода во время компиляции, но это представляется возможным при использовании неподдерживаемых API-интерфейсов javac, здесь - это публикация, в которой упоминается решение hanbuy-panno со ссылкой код ...

3 голосов
/ 16 июля 2009

Я искал что-то похожее в прошлом году. Не существует стандартного способа изменения классов с использованием процессоров аннотаций или компилятора, и документация API аннотации рекомендует создавать декораторы.

Если вы хотите жить с взломами, взгляните на использование Адрианом Кун частного API, где он добавляет литералы римских цифр в Java . Этот подход ограничен компилятором Sun javac, и вам потребуется реализовать что-то еще, если вы используете другой (например, компилятор Eclipse).


Редактировать: всем, кто интересуется этой областью, следует проверить Project Lombok .

2 голосов
/ 18 июля 2009

Вы можете сделать это, но вы не должны изменять класс, содержащий аннотации. (Уловка, на которую вы ссылаетесь, использует API дерева компиляции для изменения генерируемого байт-кода ...) Это не поддерживается и, вероятно, будет защищено в последующих Java SDK.

Правильный способ сделать это - создать класс суперкласса, подкласса или класса-оболочки.

Я написал набор аннотаций, которые генерируют геттеры / сеттеры и другие забавные вещи. Я генерирую суперкласс.

См. http://code.google.com/p/javadude/wiki/Annotations

Вы можете делать такие вещи, как

package sample;

import com.javadude.annotation.Bean;
import com.javadude.annotation.Property;
import com.javadude.annotation.PropertyKind;

@Bean(properties={
    @Property(name="name"),
    @Property(name="phone", bound=true),
    @Property(name="friend", type=Person.class, kind=PropertyKind.LIST)
}) 
public class Person extends PersonGen {
}

и он сгенерирует для вас PersonGen с полями / получателями / сеттерами и поддержкой связанных свойств.

1 голос
/ 16 июля 2009

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

Он определенно использует процессор аннотаций, просто он неявный. Команда javac будет искать путь к классу для процессоров аннотаций, если они не установлены явно.

Так как он использует эту команду для компиляции:

javac -cp ~/development/panno/build/hanhuy-panno.jar *.java

Мы видим, что он изменил путь к классу, включив в него hanhuy-panno.jar, который будет содержать процессор аннотаций.

Почему бы просто не написать письмо парню и не спросить, даст ли он вам код?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...