Автоматически добавлять неосуществленные методы во время компиляции
Я пытаюсь найти способ реализовать взлом, который похож на функциональность Eclipse "Добавить нереализованные методы".
Вместо добавления этих методов при написании кода, я хотел бы сделать это во время компиляции, генерируя тело метода с использованием шаблона. Кроме того, я не хочу изменять исходный файл.java.
Например, скажем, у меня есть следующее:
interface I { void foo(); }
class C implements I {
public static void main(String[] args) { new C().foo(); }
}
Компиляция этого обычно приводит к ошибке, потому что I.foo
не реализовано.
Я хотел бы вместо этого для успешной компиляции и последующего выполнения использовать мой шаблон. Шаблон может быть чем-то простым {throw UnsupportedOpeationException()
} Я хочу получить больше информации о методе и реализованном интерфейсе и использовать его в шаблоне, но это не должно быть трудным?
Моей первой мыслью было попробовать аннотацию (AutoImplementMethods
), но процессор аннотаций не может изменить аннотированный код, который он обрабатывает.
Мне немного комфортно с AspectJ
но я не вижу, как это сделать с помощью объявлений между типами.
Любые предложения, как это можно сделать, за исключением использования моего собственного анализатора Java и создания кода кода?
2 ответа
Посмотрите на проект lombok, так как Lombok делает что-то похожее на то, что вы хотите.
Ломбок возьмет этот источник,
public class GetterSetterExample {
@Getter @Setter private int age = 10;
@Setter(AccessLevel.PROTECTED) private String name;
@Override public String toString() {
return String.format("%s (age: %d)", name, age);
}
и создать класс, как,
public class GetterSetterExample {
private int age = 10;
private String name;
@Override public String toString() {
return String.format("%s (age: %d)", name, age);
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
protected void setName(String name) {
this.name = name;
}
}
Lombok использует API обработки вставных аннотаций JSR 269.
Здесь есть статья, описывающая, как работает lombok, и как добавить свое собственное преобразование.
Я сделал несколько инъекций кода, используя JDT Eclipse. Он генерирует деревья абстрактного синтаксиса (AST) файлов Java с разрешением всех видов привязки. JDT позволяет изменять код непосредственно на уровне дерева синтаксиса. Вот несколько полезных ссылок: