【问题标题】:Compile java code that references current program classes during runtime [closed]在运行时编译引用当前程序类的java代码[关闭]
【发布时间】:2014-08-26 23:07:06
【问题描述】:

我正在尝试编写一个允许用户创建“插件”的程序。有点像 Linux bash shell 如何通过将文件放入目录来添加命令,我试图允许用户将他们的代码放入目录中,并让我的程序执行它。

我想到了几种方法来做到这一点:

  1. 不知何故设法创建了我自己的脚本语言并让用户使用它来编写他们的插件
  2. 找到 Java 支持的现有脚本语言,并使用该语言供用户编写插件
  3. 让用户用 Java 编写他们的插件,并在我的程序运行时编译它们。

虽然所有 3 个选项看起来都很糟糕,但这是我能想到的,选项 3 似乎是三个选项中最好的。所以,我做了一些研究,发现 Java 1.6 以后支持文件的运行时编译。但是,如果用户编写的代码引用了我在基本程序中的某些特定类,我不确定编译器是否会失败。通常会,但由于我的程序正在编译它,我不知道编译器是否允许他们使用基础程序中的类。

我希望这对用户来说尽可能简单。我的主要问题是编译器是否会在我的基础程序中引用类时出现问题。我不想在我的所有类中都包含一个 .jar,并让用户在开发时将其用作库。正如我所说,我希望这对用户来说很容易,理想情况下,它应该尽可能接近解释语言。这就是为什么我想在我的程序运行时这样做,这样用户就不必为编译而烦恼。他们只需要将 .java 文件放在一个目录中并运行我的程序。

如果有人知道编译器是否会对类有问题,或者如果他们知道解决此问题的更好方法,那就太好了!

谢谢!

【问题讨论】:

    标签: java plugins compiler-construction compilation interpreted-language


    【解决方案1】:

    最常见的 Java 应用程序插件都是用 Java 编写的。插件是一项棘手的工作,因为它们暴露了很多潜在的坏事。

    如果您想将脚本语言编译为 Java,那么可以。你必须:

    1. 创建Java类http://www.javabeat.net/the-java-6-0-compiler-api/
    2. 建立一套脚本可以做什么和不能做什么的规则。
    3. 调用编译器并引用您要公开给该 Java 类的 API Jar(以便编译器可以遵循引用链)
    4. 仅将 Java 类而不是 API jar 加载到当前 ClassLoader 的 Sub ClassLoader 中。 http://www.javaworld.com/article/2077260/learn-java/the-basics-of-java-class-loaders.html

    如果您使用当前加载的相同 API jar 编译目标 *.java,则类引用应该没有问题。不要在 SUB CLASSLOADER 中加载 API JAR,因为会发生类类型错误。

    看看 LuaJava 的脚本引擎。

    http://www.keplerproject.org/luajava/manual.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-28
      • 1970-01-01
      • 1970-01-01
      • 2017-07-06
      • 2022-01-22
      相关资源
      最近更新 更多