我可以执行类似语言命令的字符串吗?

时间:2012-04-16 12:41:18

标签: java android

实施例--- 与SQL一样,我们将SQL语句编写为String,然后执行

strsql = "Select * from international_table ";

现在我们执行此语句  同样

我想要java或c#

像这样

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

之后会有一些如何执行此

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

3 个答案:

答案 0 :(得分:6)

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

但是,您的示例将被视为几乎任何语言都不必要地滥用该功能,因为您应该使用数组代表一堆数据String s1而不是String s10。通过索引可访问的值。这就是阵列的用途。

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

答案 1 :(得分: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();
 }

答案 2 :(得分:1)

取决于你想要的。如果在执行之后你想让s1和s100可供进一步使用,那么这是不可能的。也不可能编写可以访问任何非全局变量的任意代码。

您可以做的是编写一个实现接口的类,并在运行时编译该类。然后,您可以使用反射实例化此新类的实例。如果接口提供了适当的方法,则可以在执行之前,期间和之后查询此对象。您也可以使用反射来访问对象的字段。

这一切都非常hacky,并尝试以Java不适合的方式完成任务。如果你只想创建100个任意字符串,那么最好使用一个数组并创建自己的小型DSL来完成简单的任务。

您可能希望尝试的最后一种方法是使用在JVM上运行的脚本语言,例如Jython或Groovy。 Groovy非常适合这一点。由于Groovy是Java的超集,因此您不必担心有效的Java不能编译。虽然可能引起关注的是无效的Java可能会编译。例如String 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);
        }
    }

}

为此,您可以输入说明String s1 = "hello";String s2 = "world";String combined = s1 + " " + s2;的参数。