示例--- 就像 SQL 一样,我们将 SQL 语句写为字符串,然后执行
strsql = "Select * from international_table ";
现在我们做什么我们类似地执行这个语句
我想要在 java 或 c#
像这样
strjavacode = "String str = \" Masdfksdja \";System.out.Println(str); "
然后是一些如何执行这个
我渴望做这样的事情,我不必多次声明变量和赋值或声明。
是的,有些语言可以做到这一点,例如 Javascript 和 PHP,它们具有eval()
允许您将任意字符串作为代码运行的功能。
但是,您的示例在几乎任何语言中都将被视为对该功能的不必要滥用,因为您应该使用数组来表示可通过索引访问的一堆值String s1
,而不是使用单独的变量。String s10
这就是数组的用途。
Java(如 C#、C++ 和许多其他语言)没有此功能。您可以即时编译代码,但它必须是类的一部分,这是一个非常复杂的过程。
你认为你可能需要 eval 但在 Java 中你也可以实现命令模式。不过,这不会让您执行任意代码。
interface Command {
void execute();
}
class StringOutputCommand implements Command {
private final int value;
public StringOutpuCommand(final int newValue) {
this.value = newValue;
}
void execute() {
// do something with value
System.out.println(value);
}
}
// then elsewhere you could have a bunch of these command objects
List<Command> commands = new ArrayList<Command>();
for (int i = 0; i < 10; i++) {
commands.add(new StringOutputCommand(i));
}
// which you could execute like this ...
for (Command command : commands) {
command.execute();
}
取决于你想要什么。如果在执行后您希望 s1 和 s100 可供进一步使用,那么这根本不可能。也不可能编写可以访问任何非全局变量的任意代码。
您可以做的是编写一个实现接口的类并在运行时编译该类。然后,您可以使用反射实例化这个新类的实例。如果接口提供了适当的方法,您可以在执行之前、期间和之后查询此对象。您也可以使用反射来访问对象的字段。
不过,这一切都非常 hacky,并且试图以 Java 不适合的方式完成任务。如果您只想创建 100 个任意字符串,那么使用数组并创建自己的小型 DSL 来完成简单的任务可能会更好。
您可能希望尝试的最后一种方法是使用在 JVM 上运行的脚本语言,例如 Jython 或 Groovy。Groovy 非常适合这个。由于 Groovy 是 Java 的超集,您不必担心有效的 Java 无法编译。尽管可能会担心无效的 Java 可能会编译。egString s = 'some string'
是有效的 Groovy,但不是有效的 Java。
使用 Groovy,您可以执行以下操作:
import groovy.lang.GroovyShell;
public class SomeClass {
public static void main(String[] args) {
GroovyShell shell = new GroovyShell();
for (String arg : args) {
Object result = shell.evaluate(arg);
System.out.println("result is: "+result);
}
}
}
为此,您可以输入 sayString s1 = "hello";
和String s2 = "world";
的参数String combined = s1 + " " + s2;
。