【问题标题】:Is there a way to run a Java Program when you don't know its name?当您不知道 Java 程序的名称时,有没有办法运行它?
【发布时间】:2022-06-24 18:59:16
【问题描述】:

我正在使用 LWJGL 制作游戏引擎。使用它的开发人员必须能够使用脚本。我决定让他们使用 Java,因为用另一种语言编写 API 不是我将有时间或经验去做的事情。无论如何,我会使用x.main(); 来运行它,但是开发人员会告诉脚本的名称,并且它存储在一个变量中。我只是想我可以运行一个命令来做到这一点,使用 python 中的exec() 或 JavaScript 中的eval() 之类的方法。我找不到具有此执行功能的简单库。

总结这一段,我需要一个 Java 库,它可以使用 JavaScript 的 eval() 或 python 的 exec() 之类的方法

【问题讨论】:

  • Java 文件不能单独作为脚本运行。他们需要编译。编译完成后,可以扫描它们,寻找带有反射的主要方法
  • 使用反射获取方法实例并按名称执行
  • @OneCricketeer 这在技术上是不正确的,java 文件可以使用 hashbang #! 语法运行,在 JEP 330 中添加。
  • 请举例说明这些“脚本”的实际外观。它是一个 Java 类吗?
  • @StephenC 它看起来像一个统一脚本。一个循环和一个开始方法。然后执行代码。

标签: java lwjgl


【解决方案1】:

我不知道我是否理解了这个问题,但我专注于将“脚本名称存储为变量”的一部分,这对我来说听起来像是一个方法名称。您可以使用反射按名称调用方法

public class MCAlu {
    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        String scriptName = "sayHello";
        Method scriptMethod = MyScript.class.getMethod(scriptName);
        scriptMethod.invoke(null, null);
    }
}

class MyScript {
    public static void sayHello() {
        System.out.println("Hi there!");
    }
}

由于必须知道类并且在类路径中(除非您将在运行时加载它),因此类名也可以作为字符串提供

String scriptClass="MyScript";
String scriptName = "sayHello";
Method scriptMethod = Class.forName(scriptClass).getMethod(scriptName);
scriptMethod.invoke(null, null);

【讨论】:

  • 非常感谢您的帮助!现在我的引擎(有点)完成了!我不能满足你!
【解决方案2】:

JBang 是可以帮助您将 Java 源代码作为脚本运行的一个(非常流行的)工具。 Java 程序必须被编译(到 Java 类文件)以便能够由 JVM 运行。所以,基本上,JBang 隐藏了这个编译步骤,并使用我们编译的类调用 JVM。

【讨论】:

    猜你喜欢
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 2015-02-05
    • 1970-01-01
    • 1970-01-01
    • 2011-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多