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

时间:2013-02-06 23:17:08

标签: 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(); }
}

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

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

我的第一个想法是尝试注释(AutoImplementMethods),但注释处理器无法修改它正在处理的带注释的代码。

我对AspectJ感到满意,但我不知道如何使用类型间声明来完成它。

如何使用我自己的java解析器并生成代码,是否可以做到这一点?

2 个答案:

答案 0 :(得分:6)

看看project 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;
  }
}

龙目岛使用JSR 269 Pluggable Annotation Processing API

有一篇文章描述了lombok如何运作here,以及如何添加自己的转换。

答案 1 :(得分:2)

我使用JDT Eclipse进行了一些代码注入。它生成Java文件的抽象语法树(AST),并解析了各种绑定。 JDT允许您直接在Syntax Tree级别更改代码。这是一些有用的链接:

JDT Tutorial

JDT Develper Guide