小编Vic*_*rov的帖子

Java静态元编程

我想实现一个基于现有"prototype"类生成新类的注释处理器.

import java.util.List

@MyAnnotation
class MySuperClassPrototype {
    static MySuperClassPrototype createInstance() {
      return new MySuperClassPrototype();
    }
}
Run Code Online (Sandbox Code Playgroud)

由于下面的代码.将生成以下新源文件(编译单元):

import java.util.List

class MySuperClass {
    static MySuperClass createInstance() {
      return new MySuperClass();
    }
    public void specialAddedMethod() {
      /*...*/
    }
}
Run Code Online (Sandbox Code Playgroud)

我想复制所有顶级import语句和静态成员,而不是原型类的静态成员.我在Compiler Tree API(com.sun.source.tree)上走得很远.我可以打印出Tree数据类型,同时用new class name替换old.但是有些问题看起来很难.

如果我在树中获得Tree.Kind.IDENTIFIER,我如何找到它引用的实际类.我需要用MySuperClass标识符替换所有出现的MySuperClassPrototype标识符,然后打印出整个树.

这可行吗?

类似地,我需要过滤掉@MyAnnotation注释,然后再用Tree.Kind.IDENTIFIER或Tree.Kind.MEMBER_SELECT表示.

如何找到此标识符引用的实际注释类?

另一个问题是打印树.如果我使用toString方法,我得到了不错的结果,但是构造函数被打印为具有"<init>"名称的方法而不是与其类同名的方法,因此我需要手动打印每种树节点.

你可以看到我在这里附带的代码

java annotations metaprogramming abstract-syntax-tree

5
推荐指数
2
解决办法
2010
查看次数