我已经做了一些搜索,似乎有一些人提出了类似的问题,但是没有一个是我想要的(有些人提出了一些脚本的东西,但我没有足够的知识我正在做什么,所以我想只在可能的情况下使用java。)
我需要能够从String中读取代码行,然后在Java中执行它们(如下所示):
String code = "System.out.println(\"Test code\");";
很多读这篇文章的人可能会问为什么你不执行
System.out.println("Test code");
但我想执行Strings的println方法以外的代码。
是否可以单独使用java执行代码,如果是这样,它将如何编译?
答案 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
从控制台获取字符串而不是静态字符串。