# java_runtime_compiler **Repository Path**: WhiteTing/java_runtime_compiler ## Basic Information - **Project Name**: java_runtime_compiler - **Description**: No description available - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-03-28 - **Last Updated**: 2026-03-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Java 运行时编译器 一个强大的 Java 运行时编译器,允许你在运行时动态编译和执行 Java 源代码字符串,并支持通过全局变量和类型访问原始运行时环境。 ## 功能特性 - **运行时编译**: 在运行时动态编译 Java 源代码字符串 - **执行支持**: 执行编译代码的 main 方法 - **全局变量**: 在宿主应用程序和动态代码之间共享全局变量 - **全局类型**: 在动态代码中访问运行时环境类(System、Math 等) - **内存编译**: 无需文件系统,所有操作都在内存中完成 - **错误处理**: 全面的编译和执行错误诊断 - **线程安全**: 使用并发集合管理全局状态 ## 系统要求 - Java 8 或更高版本 - JDK(需要 javax.tools.JavaCompiler) ## 项目结构 ``` java_runtime_compiler/ ├── src/ │ └── main/ │ └── java/ │ └── com/ │ └── runtime/ │ └── compiler/ │ └── JavaRuntimeCompiler.java ├── examples/ │ └── TestGlobalAccess.java ├── README.md ├── README_CN.md └── .gitignore ``` ## 快速开始 ### 1. 构建项目 ```bash # 编译主类 javac -d bin src/main/java/com/runtime/compiler/JavaRuntimeCompiler.java # 或编译包含示例 javac -d bin -cp bin src/main/java/com/runtime/compiler/JavaRuntimeCompiler.java examples/TestGlobalAccess.java ``` ### 2. 基本使用 ```java import com.runtime.compiler.JavaRuntimeCompiler; public class Example { public static void main(String[] args) throws Exception { JavaRuntimeCompiler compiler = new JavaRuntimeCompiler(); // 添加全局类型 compiler.addGlobalType("System", System.class); compiler.addGlobalType("Math", Math.class); // 定义动态 Java 代码 String className = "DynamicClass_" + System.currentTimeMillis(); String sourceCode = "public class " + className + " {\n" + " public static void main(String[] args) {\n" + " System.out.println(\"Hello from dynamic code!\");\n" + " System.out.println(\"PI = \" + Math.PI);\n" + " }\n" + "}"; // 编译并执行 JavaRuntimeCompiler.CompilationResult result = compiler.compileAndExecute(sourceCode, className); if (result.isSuccess()) { System.out.println("执行成功!"); } else { System.out.println("错误:"); for (String error : result.getErrors()) { System.out.println(" " + error); } } } } ``` ### 3. 运行示例 ```bash # 运行主示例 java -cp bin com.runtime.compiler.JavaRuntimeCompiler # 运行全局访问测试 java -cp bin TestGlobalAccess ``` ## API 参考 ### JavaRuntimeCompiler 用于运行时编译和执行的主编译器类。 #### 方法 - `addGlobalVariable(String name, Object value)`: 添加可从动态代码访问的全局变量 - `addGlobalType(String name, Class type)`: 添加可从动态代码访问的全局类型 - `getGlobalVariable(String name)`: 获取全局变量 - `getGlobalType(String name)`: 获取全局类型 - `compileAndExecute(String sourceCode)`: 使用自动生成的类名编译并执行源代码 - `compileAndExecute(String sourceCode, String className)`: 使用指定类名编译并执行 ### CompilationResult 包含编译和执行信息的结果对象。 #### 方法 - `isSuccess()`: 检查编译和执行是否成功 - `getCompiledClass()`: 获取编译的类对象 - `getRuntimeEnvironment()`: 获取包含全局变量和类型的运行时环境 - `getErrors()`: 获取编译/执行错误列表 ### RuntimeEnvironment 提供对全局变量和类型的访问。 #### 方法 - `getVariable(String name)`: 获取全局变量值 - `getType(String name)`: 获取全局类型 - `getVariableNames()`: 获取所有全局变量名 - `getTypeNames()`: 获取所有全局类型名 ## 高级用法 ### 共享自定义对象 ```java JavaRuntimeCompiler compiler = new JavaRuntimeCompiler(); // 添加自定义对象 List data = new ArrayList<>(); data.add("项目1"); data.add("项目2"); compiler.addGlobalVariable("sharedData", data); // 动态代码可以通过反射或传递给方法来访问这些对象 ``` ### 错误处理 ```java JavaRuntimeCompiler.CompilationResult result = compiler.compileAndExecute(sourceCode, className); if (!result.isSuccess()) { for (String error : result.getErrors()) { System.out.println("错误: " + error); } } ``` ## 使用场景 - **动态代码执行**: 在受控环境中执行用户提供的代码 - **脚本引擎**: 将 Java 用作脚本语言 - **热重载**: 在不重启应用程序的情况下重新加载代码 - **代码评估**: 动态评估和测试代码片段 - **教育工具**: 构建交互式 Java 学习环境 - **插件系统**: 动态加载和执行插件代码 ## 限制 - 需要 JDK(不仅仅是 JRE)进行编译 - 动态代码在与宿主应用程序相同的 JVM 中运行 - 安全性:默认没有沙箱保护,动态代码具有完全访问权限 - 类名冲突:多次编译时使用唯一的类名 ## 安全注意事项 ⚠️ **警告**: 此编译器在同一 JVM 中执行代码,没有沙箱保护。仅执行可信代码或实施适当的安全措施: - 使用 SecurityManager 限制权限 - 验证和清理输入代码 - 在单独的 JVM 中运行以实现隔离 - 实施资源限制和超时 ## 贡献 欢迎贡献!请随时提交问题或拉取请求。 ## 许可证 本项目是开源的,基于 [MIT 许可证](LICENSE)。 ## 作者 由 WhiteTing 创建 ## 致谢 - 使用 Java Compiler API (javax.tools) - 受现代编程语言中动态语言特性的启发