Автоматически добавлять неосуществленные методы во время компиляции

Я пытаюсь найти способ реализовать взлом, который похож на функциональность 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 позволяет изменять код непосредственно на уровне дерева синтаксиса. Вот несколько полезных ссылок:

Учебник JDT

Руководство по разработке JDT

Другие вопросы по тегам