如何基于注释(类似于Android&#R; s)类自动生成具有静态成员的类

时间:2015-06-24 23:29:09

标签: java eclipse gradle libgdx

假设我有这个:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE)
public @interface Config {

} 

@Config
public class ConfigA {
    public static final String FOO_A = "A";
}

@Config
public class ConfigB {
    public static final String FOO_B = "B";
    public static final String SOMETHING_ELSE = "SE";
}

我想自动生成一个类似这样的类:

public class Result {
    public static final String FOO_A = "A";
    public static final String FOO_B = "B";
    public static final String SOMETHING_ELSE = "SE";
}

忽略冲突的可能性我该如何实现?

最终目标是根据构建类型/风格自动生成带Gradle的Result,因为我正在使用Eclipse创建一个生成Result的构建器,以便能够使用源中的成员。 (就像Android项目中的R文件是从XML文件生成的,但我不想使用XML)

1 个答案:

答案 0 :(得分:0)

我要做以下事情:

  1. 创建一个单独的项目(例如,名为codegen)以包含类生成逻辑。在那里,我使用Reflections扫描使用@Config注释的类,将其所有成员添加到列表中,最后使用Velocity输出包含这些成员的类或类似的模板库。
  2. 将您的@Config注释和您要注释的课程添加到他们自己的Gradle项目中,例如名为config
  3. 在build.gradle文件中,创建一个任务(例如processConfig),该任务在#2生成的类上运行模板工具。
  4. 让Gradle项目使用模板化输出(例如,名为solution)取决于processConfig,并将其输出添加到自定义SourceSet。
  5. 只要您已正确配置了源集,并确保主源集依赖于您的中间源集,solution构建的其余部分就可以正常工作。

    或者,有更多涉及的方法使用ASM或cglib直接生成字节码也可以工作。