2012-07-05 80 views
0

我正在寻找一个Java程序,它将以文本格式从网上下载Java源文件,编译它,加载它,并将其用作正在运行的程序的一部分。我听说这是可能的,但不知道如何编写代码来实现它。如果你能指出我这样的文档方向,那么一个功能完整的示例或教程将非常棒。如何编写将编译,加载和使用网络代码的Java程序

一旦我了解了如何完成,我打算利用这些知识来构建一个Android应用程序,该应用程序可以使用Web上的代码进行自定义。

+0

*“我正在寻找一个Java程序哪个..”*用于在Android上部署?使用J2SE会很棘手,并且在JDK中有'JavaComplier'。 – 2012-07-05 23:09:20

+0

嗨安德鲁。是的,我打算使用这些知识来构建Android应用程序。 – 2012-07-05 23:13:07

+0

嵌入现有的脚本语言可能更容易 - Lua? - 或者根据您的应用程序设计自己的脚本语言,并用_that_扩展您的应用程序。将Java编译为字节码以在内存和处理器受限的设备上运行它似乎是在推动界限。 – sarnold 2012-07-05 23:13:20

回答

1

桌面程序可以使用shell脚本来下载,编译和运行Java程序。 Android没有编译器,添加一个并不重要。最简单的方法是制作一个服务器程序。然后Android程序会通知服务器程序下载并编译Java源代码,然后将结果发送给Android程序,然后该程序将使用其ClassLoader加载它。

一个警告是,JDK编译器为标准Java虚拟机生成字节码,而Android的JVM使用Dalvik VM,所以当您编译Java类时,不能只使用JDK;您必须使用Android SDK来生成Android ClassLoader可以使用的兼容字节码。

+0

我认为这可能是解决方案。我需要了解如何在服务器上使用Android SDK,而不是JDK。 – 2012-07-05 23:22:43

+0

http://developer.android.com/tools/building/index.html – 2012-07-06 01:11:58

0

是的,在一般意义上可以做你想做的事。然而,在Android的特定情况下,沙箱可能会施加限制,这会使您尝试做的事情变得困难或不可能。在一般的情况下做到这一点,你可以用这样的方法:

  1. 使用你选择的网络库(例如,HttpClient,或者HtmlUnit,或者简单的任务,Java的内置URLConnection类是完全也可以接受)在本地下载Java文件。

  2. 使用System.exec()到餐桌一个javac过程编译为您下载的Java文件(或使用JavaCompiler实现这样做)。请注意,如果下载的Java文件使用不在系统中的外部JAR /库,这可能会有点棘手。

  3. Use the ClassLoader to load your compiled class。请注意,如果您的运行时类路径还包含您要加载的代码所依赖的任何外部JAR库,则只能使用它。

但是,在Android设备上几乎肯定不会有第2步。相反,您需要编译Android兼容的类文件(如服务器上的Yusuf建议的那样),然后从您的应用程序下载并加载已编译的类文件。或者,如果您确实在寻找挑战,也许您可​​以在应用程序中打包完整的Java编译器,然后以此方式编译Java文件。

-1

权限将是一个问题。您无法将文件写入安装应用程序的分区。也许你可以将应用程序移动到SD卡上。

另一种方法是创建自定义类加载器并使用它将类文件提供给运行时。我不知道你是否可以在Android上做到这一点。

正在编写脚本选项吗?我相信你可以找到Android的脚本解释器。然后你可以在解释器中下载并执行脚本。

+0

只要脚本可以完全访问Android API,它就是一个选项。 – 2012-07-05 23:49:38

+0

通常情况下,解释器可以让你控制暴露你想要暴露给脚本的内容。 – 2012-07-05 23:54:13

+0

应用程序未安装在/ system上。你不能写入他们安装的位置,但你不需要。如果你想安装一个新的应用程序,你可以将平台指向你临时放置的位置,然后弹出一个用户确认对话框,然后以可运行的形式安装它。如果你想在你的应用中使用代码,你可以使用一个类加载器,在你的私有存储中保存它的位置。 – 2012-07-05 23:57:03

0

你所试图做的是类似无论是JRuby-for-Android项目或AIDE这两者的基础上设备,但只有在创建应用程序的情况下要在Android上运行,而不是添加代码的功能到当前正在运行的东西应用程序。尽管JRuby for Android更适用于脚本编写,但它可以提供足够的功能,因为它是开源的,您可能可以对其进行修改以适应您的需求。

AIDE项目看起来更像是一项成就,因为您可以使用Java编写器件来编写应用程序。功能包括Dropbox和git支持。 AIDE似乎是一个封闭的应用程序。

+0

这也是一个很好的潜在解决方案。谢谢! – 2012-07-07 20:58:04