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

标签 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";
    } 
}

如何编写接口(interface):

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

我知道我需要进行某种 AST 转换才能使它变得神奇。

我也知道 lombok 项目,但我想知道一个简单示例的最小公分母是什么,最好是在一个方法中,最好是一个好的编辑器会自动考虑的东西,例如 RetentionPolicy。 javac编译器的SOURCE,可以在Intellij IDEA中使用。

lombok 项目是一个野兽代码明智的,是一个很难开始的地方。

它一定比那更简单,不是吗?

有什么想法吗?

最佳答案

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

可以分两步完成:

  1. 通过反射读取带注释的类,并将其转换为表示新类源代码的字符串。
  2. 将此字符串写入文件,使用 Java 编译器 API 编译此字符串,然后以编程方式加载和实例化新类;见exact steps here .

实现类似功能的替代方法也可以通过字节码检测(参见 cglibjavassist )或什至使用 proxies 获得。 .

关于Java:在编译时使用注释生成自定义 Java 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26004012/

相关文章:

java - 返回在各种语言的函数中创建的数组和对象

java - Gradle 多项目存储库配置不适用于 spring-boot 应用程序

java - Apache 光束 : Unable to find registrar for gs

Java 8 流 HashMap<String, ArrayList<String>> 到 SortedMap<String, Integer>

java - 如何使用 java 8 流按几个条件获取排序的分页 map

java - Tomcat 7 && Java 8 中的严重 : Unable to process Jar entry [module-info. 类]

java - 如何 : Dynamically-defined properties in Java

java - 如何让一个应用程序只工作 3 天

java - 可以显式删除对 lambda 的序列化支持

Java 8 更新 151 还是 152?