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

mom*_*omo 9 java java-8

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

例如,我想要这个:

@Generate
class Person {
     String firstname, lastname;
}
Run Code Online (Sandbox Code Playgroud)

生成:

class Person {
    String firstname, lastname;

    public static class $Fields { 
           public static String firstname = "firstname";
           public static String lastname  = "lastname";
    } 
}
Run Code Online (Sandbox Code Playgroud)

我该如何编写界面:

@Retention(RetentionPolicy.SOURCE)
public @interface Generate {
     // ... 
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

有任何想法吗?

m3t*_*man 3

您可以通过反射来做到这一点,但您的新类不会是内部类;而是内部类。但请注意,您将失去静态类型安全性。

可以分两步完成:

  1. 通过反射读取带注释的类,并将其转换为代表新类的源代码的字符串。
  2. 将此字符串写入文件,使用 Java 编译器 API 编译此字符串,然后加载并实例化新类,所有这些都以编程方式进行;请参阅此处的具体步骤

实现类似功能的替代方法也可以通过字节码工具(参见cglibjavassist)或者甚至使用代理来获得。