在编译期间自动添加未实现的方法

Mis*_*ble 4 java code-generation aspectj cglib

我正在尝试找到如何实现类似于Eclipse功能"添加未实现的方法"的hack.

我不想在编写代码时添加这些方法,而是希望在编译期间执行此操作,使用模板生成方法体.此外,我不想修改原始的.java源文件.

例如,假设我有以下内容:

interface I { void foo(); }
class C implements I { 
  public static void main(String[] args) { new C().foo(); }
}
Run Code Online (Sandbox Code Playgroud)

编译它通常会导致错误,因为I.foo没有实现.

我希望编译成功并随后执行以使用我的模板.模板可以是简单的东西{throw UnsupportedOpeationException()}我希望能够获得有关方法和实现的接口的更多信息并在模板​​中使用它,但这应该不难?

我的第一个想法是尝试注释(AutoImplementMethods)但注释处理器不能修改它正在处理的注释代码.

我有点习惯,AspectJ但我不知道如何使用类型间声明.

任何建议如何做到这一点,没有使用我自己的java解析器和生成代码?

sbr*_*ges 6

看看项目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);
  }
Run Code Online (Sandbox Code Playgroud)

并生成一个类,

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;
  }
}
Run Code Online (Sandbox Code Playgroud)

Lombok使用JSR 269 Pluggable Annotation Processing API.

有一篇文章描述了lombok如何在这里工作,以及如何添加自己的转换.