Java:使用注释在编译时生成自定义Java代码

时间:2014-09-23 20:17:52

标签: java java-8

如何使用注释在编译时编写带有自定义属性的Java内部类?

例如,我想要这个:

@Generate
class Person {
     String firstname, lastname;
}

生成:

class Person {
    String firstname, lastname;

    public static class $Fields { 
           public static String firstname = "firstname";
           public static String lastname  = "lastname";
    } 
}

如何编写界面:

@Retention(RetentionPolicy.SOURCE)
public @interface Generate {
     // ... 
}

我知道我需要做一些AST转换才能让这个神奇。

我也知道项目lombok,但我想通过一个简单的例子知道最不常见的分母,最好是在一个方法中,最好是一个好的编辑器会自动考虑的东西,例如 RetentionPolicy。源代码用于javac编译器,可以在Intellij IDEA中使用。

项目lombok是一个明智的野兽代码,是一个艰难的起点。

它必须比那更简单,不是吗?

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

你可以通过反思来做到这一点,但你的新班级不会成为内心阶级;但要注意,你将失去静态类型的安全性。

可以分两步完成:

  1. 通过反射读取带注释的类,并将其转换为表示新类源代码的String。
  2. 将此字符串写入文件,使用Java编译器API编译此String,然后以编程方式加载和实例化新类;见exact steps here
  3. 通过字节码检测(参见cglibjavassist)或甚至可能使用proxies,也可以获得实现类似功能的替代方案。