在线Java代码执行器 - 基于JVM动态编译技术的Web应用
📚 参考《深入理解Java虚拟机》第9.3节:实战-自己动手实现远程执行功能
- 🌐 在线编译执行:无需本地环境,浏览器中直接运行Java代码
- 🔄 实时编译:基于内存的动态编译,无临时文件
- 🛡️ 安全隔离:自定义ClassLoader和SecurityManager
- 🎯 现代界面:玻璃拟态设计风格,支持代码高亮和快捷键
- ⚡ 快速响应:毫秒级编译和执行
| 组件 | 功能 | 实现文件 |
|---|---|---|
| StringSourceCompiler | 动态编译器 | StringSourceCompiler.java |
| MyClassLoader | 自定义类加载器 | MyClassLoader.java |
| HackSystem | 输出流重定向 | HackSystem.java |
| ClassModifier | 字节码修改器 | ClassModifier.java |
| JavaClassExecutor | 代码执行器 | JavaClassExecutor.java |
- 后端框架:Spring Boot 2.6.2 + Spring MVC
- 模板引擎:Thymeleaf
- 编译技术:Java Compiler API (javax.tools)
- 类加载:自定义ClassLoader
- 字节码操作:ASM框架替代方案
- Java: 8+ (推荐17+)
- Maven: 3.6+
- 内存: 最小512MB
-
克隆项目
git clone https://github.com/shaojunying/OnlineExecutor.git cd OnlineExecutor -
编译项目
mvn clean compile
-
启动应用
mvn spring-boot:run
-
访问应用
http://localhost:8080/executor💡 使用提示:支持快捷键
Ctrl+Enter运行代码,Ctrl+L清空输出
# 构建镜像
docker build -t online-executor .
# 运行容器
docker run -p 8080:8080 online-executorpublic class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, OnlineExecutor!");
}
}import java.util.*;
public class Algorithm {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(3, 1, 4, 1, 5, 9, 2, 6);
Collections.sort(numbers);
System.out.println("排序结果: " + numbers);
// 计算斐波那契数列
for (int i = 0; i < 10; i++) {
System.out.print(fibonacci(i) + " ");
}
}
static int fibonacci(int n) {
return n <= 1 ? n : fibonacci(n-1) + fibonacci(n-2);
}
}graph LR
A[Java源码] --> B[StringSourceCompiler]
B --> C[内存编译]
C --> D[字节码数组]
D --> E[ClassModifier]
E --> F[修改System调用]
F --> G[MyClassLoader]
G --> H[加载Class]
H --> I[执行main方法]
I --> J[HackSystem捕获输出]
J --> K[返回结果]
// 使用Java Compiler API在内存中编译代码
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);// 将System.out.println替换为HackSystem.out.println
public static byte[] modifySystemOut(byte[] srcByte) {
return replace(srcByte, "java/lang/System", "com/shao/execute/HackSystem");
}// 自定义PrintStream捕获程序输出
public static final PrintStream out = new PrintStream(new ByteArrayOutputStream());// 自定义ClassLoader实现类的重复加载
protected Class<?> findClass(String name) throws ClassNotFoundException {
return defineClass(name, classByte, 0, classByte.length);
}- 🚫 文件I/O限制:不支持文件读写操作
- 🚫 网络访问限制:禁止网络连接
- ⏱️ 执行时间限制:默认5秒超时
- 💾 内存限制:单次执行最大128MB
- 📦 依赖限制:仅支持JDK标准库
src/main/java/com/shao/
├── compile/ # 编译模块
│ └── StringSourceCompiler.java
├── execute/ # 执行模块
│ ├── JavaClassExecutor.java
│ ├── MyClassLoader.java
│ ├── HackSystem.java
│ ├── ClassModifier.java
│ └── ByteUtils.java
├── controller/ # Web控制器
│ └── ExecutorController.java
├── service/ # 业务服务
│ └── ExecutorService.java
└── OnlineExecutorApplication.java
- 实现新的
Compiler接口 - 添加对应的
Executor - 更新前端界面
- 实现更严格的
SecurityManager - 添加资源使用监控
- 实现代码静态分析
| 版本 | 更新内容 | 发布日期 |
|---|---|---|
| v0.8 | 🎨 现代化UI界面重新设计 | 2025-01 |
| v0.7 | 🎉 Spring Boot Web界面 | 2023-12 |
| v0.6 | 🐛 编译错误收集功能 | 2023-11 |
| v0.5 | ⚡ 动态编译功能实现 | 2023-10 |
| v0.4 | 🔧 字节码常量池修改 | 2023-09 |
| v0.3 | 🛡️ HackSystem输出重定向 | 2023-08 |
| v0.2 | 🔄 自定义ClassLoader | 2023-07 |
| v0.1 | 🚀 项目初始化 | 2023-06 |
详细更新日志请查看 CHANGELOG.md
- Fork 本仓库
- 创建特性分支:
git checkout -b feature/AmazingFeature - 提交更改:
git commit -m 'Add some AmazingFeature' - 推送分支:
git push origin feature/AmazingFeature - 提交 Pull Request
本项目采用 MIT 协议开源 - 查看 LICENSE 文件了解详情
- 邵俊英 - 项目创建者 - @shaojunying
- 📖 感谢《深入理解Java虚拟机》提供的理论基础
- 🌟 感谢Spring Boot团队提供的优秀框架
- 💡 感谢所有贡献者的宝贵建议
- 📧 Email: your.email@example.com
- 💬 Issues: GitHub Issues
- 📱 Blog: 技术博客
⭐ 如果这个项目对你有帮助,请给它一个Star!

