从 Java 中的字符串执行代码
Execute code from a String in Java
我做了一些搜索,似乎有几个人问过类似的问题,但是 none 正是我要找的东西(有些人建议了一些脚本的东西,但我没有对我所做的事情有足够的了解,所以我只想在可能的情况下使用 java。
我需要能够从字符串中读取代码行,然后在 Java 中执行它们(像这样):
String code = "System.out.println(\"Test code\");";
很多读这篇文章的人post可能会问你为什么不直接执行
System.out.println("Test code");
但我想执行字符串中 println 方法以外的代码。
是否可以单独使用 java 来执行代码,如果可以的话如何编译??
可以,但是java代码不能这样执行,没有解释,需要先编译。
所以你需要把你的字符串放到另一个java文件的主函数中,然后编译它,最后运行它。
您可能需要这个:http://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html
您无法像我想象的那样轻松地做到这一点。您所描述的内容可能会在 dynamic 语言中看到。 Java 完全不是一种动态语言 - 这是其特征的一部分。
如果您的 class 路径中有 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);
从那里你可以使用 class 加载器,加载你编译的 class,然后 运行 它。
然而,这不是一种简单或主流的使用方式 Java,而且通常人们不会这样做,因为这既不是好的做法,也不是必需的。这是一项安全功能,您不能 运行 编译后用户提供的代码。
如果你想要一种更动态的语言,在 Java 生态系统中,你可以看看 Groovy。
或者,您可以 运行 用户提供的 Java 脚本,使用 Java Scripting API.[=13= 控制访问您的 Java 程序的数据]
如果我理解正确,你想在 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
从控制台而不是静态字符串获取字符串。
我做了一些搜索,似乎有几个人问过类似的问题,但是 none 正是我要找的东西(有些人建议了一些脚本的东西,但我没有对我所做的事情有足够的了解,所以我只想在可能的情况下使用 java。
我需要能够从字符串中读取代码行,然后在 Java 中执行它们(像这样):
String code = "System.out.println(\"Test code\");";
很多读这篇文章的人post可能会问你为什么不直接执行
System.out.println("Test code");
但我想执行字符串中 println 方法以外的代码。
是否可以单独使用 java 来执行代码,如果可以的话如何编译??
可以,但是java代码不能这样执行,没有解释,需要先编译。 所以你需要把你的字符串放到另一个java文件的主函数中,然后编译它,最后运行它。
您可能需要这个:http://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html
您无法像我想象的那样轻松地做到这一点。您所描述的内容可能会在 dynamic 语言中看到。 Java 完全不是一种动态语言 - 这是其特征的一部分。
如果您的 class 路径中有 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);
从那里你可以使用 class 加载器,加载你编译的 class,然后 运行 它。
然而,这不是一种简单或主流的使用方式 Java,而且通常人们不会这样做,因为这既不是好的做法,也不是必需的。这是一项安全功能,您不能 运行 编译后用户提供的代码。
如果你想要一种更动态的语言,在 Java 生态系统中,你可以看看 Groovy。
或者,您可以 运行 用户提供的 Java 脚本,使用 Java Scripting API.[=13= 控制访问您的 Java 程序的数据]
如果我理解正确,你想在 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
从控制台而不是静态字符串获取字符串。