SourceBuddy 2.0.0 发布总结
主要观点
Peter Verhas,EPAM Systems 的高级架构师,在2022年10月首次提交后的两个月内,发布了 SourceBuddy 的 2.0.0 版本。SourceBuddy 是一个新工具,用于将动态创建的 Java 源代码(定义为 String 或文件)编译为 class 文件。它是对 javac 编译器的简化封装,提供相同的功能,并要求使用 Java 17。
关键信息
版本 2.0.0 的新特性:
- 支持在编译时和运行时隐藏类和非隐藏类的组合。
- API 简化,包含破坏性更改,例如将
loadHidden()方法改为hidden()方法,因此发布了新的大版本。
依赖添加:
可以通过 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'
使用示例:
通过
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);
隐藏类支持:
- 使用
hidden()方法创建隐藏类,这些类不能直接被其他类使用,只能通过反射使用返回的类对象。
- 使用
字节码处理:
compile()方法生成字节码,但不加载到内存中。可以将字节码保存到本地驱动器:
byteCodes.saveTo(Paths.get("./target/generated_classes"));- 使用
stream()方法获取字节码流,并检索二进制名称等信息。
类加载与实例化:
- 使用
byteCodes.load()方法加载类并将字节码转换为Class对象。 - 通过反射 API 或
newInstance()方法访问和实例化类。
- 使用
重要细节
- 多文件编译:可以通过多次调用
from()方法或一次性加载特定目录中的所有源文件来编译多个源文件。 - 类信息检索:使用流式 API 可以检索类的详细信息,例如类名。
更多信息
有关 SourceBuddy 的详细信息,请参阅 GitHub 上的 README 文件。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。