4

我正在尝试找到如何实现类似于 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 解析器和生成代码代码之外,有什么建议可以做到这一点吗?

4

2 回答 2

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);
  }

并生成一个类,如

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 使用JSR 269 Pluggable Annotation Processing API

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

于 2013-02-14T02:19:27.357 回答
2

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

JDT 教程

JDT 开发者指南

于 2013-02-07T00:22:03.493 回答