我正在用 Java 开发一个基于组件的游戏引擎,现在当我对组件进行更改时,我需要重建并重新启动编辑器以使更改生效(或者我可以使用一些有限的热代码注入(inject),如果应用程序正在 Debug模式下运行)。
我正在寻找一种允许用户修改组件源并重新加载它们而无需重新启动应用程序的方法(也许只是退出并进入游戏模式)。我需要的另一个重要特性是最终导出的代码应该是 native Java 代码(因此最终结果中不应使用解释器)。
你能给我一些关于如何在项目中集成 beanshell 解释器的指示吗?我可以手动监视源文件夹的更改并将更新的 java 类提供给它,但是热交换真的会发生吗?
最佳答案
首先,标题有点乱。您不需要集成 BeanShell。你真正需要的是:
- 定义合适的架构
- 使用 Java 编译器 API 来处理 java 类
架构
假设您有一个对象图。有很多对象、引用等。因此用新实例替换某些实例确实是一项棘手的任务。您可以将动态部分隐藏在“静态”代理后面,而不是解决这个问题。代理将处理所有重新加载的东西(包括源文件夹监控)。
重新加载之前:
重新加载后:
完成后,您可以轻松跟踪更改并在需要时更新动态部分。
Java 编译器 API
您可以使用 Java,而不是使用解释性语言,即时编译它并使用“Class.forName()”加载。由于这种方法存在了一段时间,因此有很多不同的例子。
这里有一些细节:
关于java - 如何整合beanshell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27331252/