1

示例--- 就像 SQL 一样,我们将 SQL 语句写为字符串,然后执行

strsql = "Select * from international_table ";

现在我们做什么我们类似地执行这个语句

我想要在 java 或 c#

像这样

strjavacode = "String str = \" Masdfksdja \";System.out.Println(str); "

然后是一些如何执行这个

我渴望做这样的事情,我不必多次声明变量和赋值或声明。

4

3 回答 3

6

是的,有些语言可以做到这一点,例如 Javascript 和 PHP,它们具有eval()允许您将任意字符串作为代码运行的功能。

但是,您的示例在几乎任何语言中都将被视为对该功能的不必要滥用,因为您应该使用数组来表示可通过索引访问的一堆值String s1,而不是使用单独的变量。String s10这就是数组的用途。

Java(如 C#、C++ 和许多其他语言)没有此功能。您可以即时编译代码,但它必须是类的一部分,这是一个非常复杂的过程。

于 2012-04-16T12:50:45.360 回答
4

你认为你可能需要 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();
 }
于 2012-04-16T12:58:49.540 回答
1

取决于你想要什么。如果在执行后您希望 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;

于 2012-04-16T13:07:43.240 回答