【问题标题】:Automatically add unimplemented methods during compilation在编译期间自动添加未实现的方法
【发布时间】:2013-02-14 10:19:27
【问题描述】:

我正在尝试找到如何实现类似于 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),但注释处理器无法修改它正在处理的注释代码。

我对@9​​87654326@ 有点满意,但我不明白它是如何使用类型间声明来完成的。

除了使用我自己的 java 解析器和生成代码之外,有什么建议可以做到这一点吗?

【问题讨论】:

  • 我使用 JDT Eclipse 进行了一些代码注入。它会生成 Java 文件的抽象语法树 (AST),并解决了各种绑定问题,您可以更改树,它会直接更改代码。
  • @ShivamKalra 你知道某处的教程或示例吗?我确实需要一种适用于javac 的方法,但我可以使用 Eclipse 查看代码生成部分
  • 老实说这方面的教程并不多!但这是我在网上找到的一个 -> vogella.com/articles/EclipseJDT/article.html
  • 您能否将您的 cmets 转换为包含单独链接的回复?

标签: java code-generation aspectj cglib


【解决方案1】:

看看project lombok,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 的工作原理here,以及如何添加自己的转换。

【讨论】:

  • 这看起来很有希望。谢谢。
  • 那是......令人难以置信的惊人。谢谢!
【解决方案2】:

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

JDT Tutorial

JDT Develper Guide

【讨论】:

    猜你喜欢
    • 2013-11-15
    • 1970-01-01
    • 2021-05-29
    • 1970-01-01
    • 1970-01-01
    • 2020-04-30
    • 1970-01-01
    • 1970-01-01
    • 2014-08-04
    相关资源
    最近更新 更多