我正在寻找编写一个 Java 程序,它将从网上下载一个文本格式的 Java 源文件,编译它,加载它,并将其用作运行程序的一部分。我听说这是可能的,但不知道如何编写代码来实现它。如果您能指出我这样的文档的方向,一个功能齐全的示例或教程会很棒。
一旦我了解了它是如何完成的,我计划使用这些知识来构建一个 Android 应用程序,该应用程序可以使用来自网络的代码进行自我定制。
我正在寻找编写一个 Java 程序,它将从网上下载一个文本格式的 Java 源文件,编译它,加载它,并将其用作运行程序的一部分。我听说这是可能的,但不知道如何编写代码来实现它。如果您能指出我这样的文档的方向,一个功能齐全的示例或教程会很棒。
一旦我了解了它是如何完成的,我计划使用这些知识来构建一个 Android 应用程序,该应用程序可以使用来自网络的代码进行自我定制。
桌面程序可以使用 shell 脚本来下载、编译和运行 Java 程序。Android 没有编译器,添加一个编译器并非易事。最简单的方法是也制作一个服务器程序。然后,Android 程序会告诉服务器程序下载并编译 Java 源代码,然后将结果发送给 Android 程序,然后由 Android 程序使用其ClassLoader加载它。
需要注意的一点是,JDK 编译器为标准 Java 虚拟机生成字节码,而 Android 的 JVM 使用的是 Dalvik VM,因此在编译 Java 类时,不能只使用 JDK;您必须使用 Android SDK 来生成 Android ClassLoader 可以使用的兼容字节码。
是的,从一般意义上说,你可以做你想做的事。然而,在 Android 的特定情况下,沙盒可能会施加限制,使您尝试做的事情变得困难或不可能。要在一般情况下执行此操作,您可以使用以下方法:
使用您选择的 Web 库(例如HttpClient或HtmlUnit,或者对于简单的任务,Java 的内置URLConnection
类也完全可以接受)在本地下载 Java 文件。
用于System.exec()
派生一个javac
进程来为您编译下载的 Java 文件(或使用JavaCompiler实现来做同样的事情)。请注意,如果下载的 Java 文件使用您系统上不存在的外部 JAR/库,这可能会有点棘手。
使用 ClassLoader 加载已编译的类。请注意,只有当您的运行时类路径还包含您正在加载的代码所依赖的任何外部 JAR/库时,您才能使用它。
但是,几乎可以肯定,第 2 步在 Android 设备上是不可能的。相反,您需要在其他地方编译与 Android 兼容的类文件(如 Yusuf 建议的那样在服务器上),然后从您的应用程序下载并加载已编译的类文件。或者,如果您真的在寻找挑战,也许您可以在您的应用程序中打包一个完整的 Java 编译器,并以这种方式编译 Java 文件。
您正在尝试做的事情类似于JRuby-for-Android项目或AIDE两者都构建在设备上,但仅适用于创建要在 Android 上运行的应用程序,而不是向当前正在运行的应用程序添加代码功能应用程序。虽然 JRuby-for-Android 更适合编写脚本,但它可能提供足够的功能,因为它是开源的,您可以对其进行修改以满足您的需求。
AIDE 项目似乎更像是一项成就,因为您可以在设备上用 Java 编写来构建应用程序。功能包括 Dropbox 和 git 支持。AIDE 似乎是一个闭源应用程序。
权限将是一个问题。您无法将文件写入安装应用程序的分区。如果您将应用程序移至 SD 卡,也许可以。
另一种方法是创建一个自定义类加载器并使用它将类文件提供给运行时。我不知道你是否可以在Android上做到这一点。
脚本是一种选择吗?我相信您可以找到适用于 Android 的脚本解释器。然后您可以在解释器中下载并执行脚本。