从Java中的String执行代码

时间:2017-08-22 14:55:08

标签: java string execution

我已经做了一些搜索,似乎有一些人提出了类似的问题,但是没有一个是我想要的(有些人提出了一些脚本的东西,但我没有足够的知识我正在做什么,所以我想只在可能的情况下使用java。)

我需要能够从String中读取代码行,然后在Java中执行它们(如下所示):

String code = "System.out.println(\"Test code\");";

很多读这篇文章的人可能会问为什么你不执行

System.out.println("Test code");

但我想执行Strings的println方法以外的代码。

是否可以单独使用java执行代码,如果是这样,它将如何编译?

3 个答案:

答案 0 :(得分:2)

你不能像我想象的那样容易地做到这一点。您所描述的内容是您可能会在动态语言中看到的内容。 Java非常不是一种动态语言 - 这是它的一部分。

如果您的类路径中有tools.jar,则可以在Java程序中编译Java代码:

com.sun.tools.javac.Main javac = new com.sun.tools.javac.Main();
String[] options = new String[] {
    "-classpath", classpath, "-d", outputDir, filename
};
javac.compile(options);

从那里你可以与类加载器搏斗,加载你编译的类,并运行它。

然而,这不是一种使用Java的简单或主流方式,通常人们不会这样做,因为它既不是好的做法也不是必要的。这是一项安全功能,您无法在编译后运行用户提供的代码。

如果你想要一个更动态的语言,在Java生态系统中,你可以看看Groovy。

或者,您可以使用Java Scripting API运行用户提供的Javascript,使其可以访问您的Java程序数据。

答案 1 :(得分:1)

有可能但java代码不能这样执行,它不被解释,需要先编译。 所以你需要把你的字符串放到另一个java文件的main函数中,然后编译它,最后运行它。

您可能需要:http://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html

答案 2 :(得分:1)

如果我理解正确,你想在java控制台中输入一个字符串。然后,这个给定的字符串应该在外部程序中神奇地输入。如果我不明白,我会再次删除该答案。

public class Test {

    public static void main(String[] args) throws IOException, ClassNotFoundException, Exception {
    Robot robot = new Robot();
    String text = "Hello";
    File file = File.createTempFile("tmp", ".txt");

    if (Desktop.isDesktopSupported()) {
        Desktop.getDesktop().edit(file);
        Thread.sleep(1000);
    } else {
        // dunno, up to you to handle this
    }
    for (char c : text.toCharArray()) {
        int keyEvent = KeyEvent.getExtendedKeyCodeForChar(c);
        robot.keyPress(keyEvent);
        Thread.sleep(500);
    }
    }
}

如果您运行此基本代码,则应打开记事本并输入文本 Hello 。这就是我为你准备的。现在你需要做的是使用Scanner从控制台获取字符串而不是静态字符串。