我正在尝试找到如何实现类似于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解析器并生成代码,是否可以做到这一点?
答案 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级别更改代码。这是一些有用的链接: