SourceBuddy 编译动态创建的Java源代码

SourceBuddy 2.0.0 发布总结

主要观点

Peter Verhas,EPAM Systems 的高级架构师,在2022年10月首次提交后的两个月内,发布了 SourceBuddy 的 2.0.0 版本。SourceBuddy 是一个新工具,用于将动态创建的 Java 源代码(定义为 String 或文件)编译为 class 文件。它是对 javac 编译器的简化封装,提供相同的功能,并要求使用 Java 17。

关键信息

  1. 版本 2.0.0 的新特性

    • 支持在编译时和运行时隐藏类和非隐藏类的组合。
    • API 简化,包含破坏性更改,例如将 loadHidden() 方法改为 hidden() 方法,因此发布了新的大版本。
  2. 依赖添加

    • 可以通过 Maven 或 Gradle 添加依赖:

      • Maven:

        <dependency>
            <groupId>com.javax0.sourcebuddy</groupId>
            <artifactId>SourceBuddy</artifactId>
            <version>2.0.0</version>
        </dependency>
      • Gradle:

        implementation 'com.javax0.sourcebuddy:SourceBuddy:2.0.0'
  3. 使用示例

    • 通过 Compiler.compile() 方法编译单个类:

      String source = """
      package com.app;
      
      public class CustomClass implements PrintInterface {
          @Override
          public void print() {
              System.out.println("Hello world!");
          }
      }""";
      Class<?> clazz = Compiler.compile(source);
      PrintInterface customClass = 
          (PrintInterface) clazz.getConstructor().newInstance();
      customClass.print();
    • 使用流式 API 编译多个文件:

      Compiler.java().from(source).compile().load().newInstance(PrintInterface.class);
  4. 隐藏类支持

    • 使用 hidden() 方法创建隐藏类,这些类不能直接被其他类使用,只能通过反射使用返回的类对象。
  5. 字节码处理

    • compile() 方法生成字节码,但不加载到内存中。
    • 可以将字节码保存到本地驱动器:

      byteCodes.saveTo(Paths.get("./target/generated_classes"));
    • 使用 stream() 方法获取字节码流,并检索二进制名称等信息。
  6. 类加载与实例化

    • 使用 byteCodes.load() 方法加载类并将字节码转换为 Class 对象。
    • 通过反射 API 或 newInstance() 方法访问和实例化类。

重要细节

  • 多文件编译:可以通过多次调用 from() 方法或一次性加载特定目录中的所有源文件来编译多个源文件。
  • 类信息检索:使用流式 API 可以检索类的详细信息,例如类名。

更多信息

有关 SourceBuddy 的详细信息,请参阅 GitHub 上的 README 文件。

阅读 36
0 条评论