2012-04-16 99 views
1

例子--- 像SQL我们编写SQL语句作为字符串,然后我们执行我可以执行一个类似语言命令的字符串吗?

strsql = "Select * from international_table "; 

现在我们做什么我们执行该语句 同样

我想在Java或C#

这样的

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

之后有些如何执行这个

我很想做这样的事情,我不需要声明变量并且多次指定值 或者语句。

+4

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html – asawyer 2012-04-16 12:42:59

+2

这还不清楚。你试图解决什么问题? – 2012-04-16 12:44:01

+0

它不是问题 – Trikaldarshi 2012-04-16 12:44:31

回答

1

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

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

虽然这是非常黑客,并试图以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;的输入ARGS。

6

是的,有可能的语言,如Javascript和PHP,它有一个eval()函数,允许您运行任意字符串作为代码。

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

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

+0

首先尝试了解我的问题 – Trikaldarshi 2012-04-16 12:56:51

+1

@Photon :我完全理解你的问题。现在试着理解我的答案。 – 2012-04-16 13:00:11

+2

@Photon - 你有一个态度问题。我相信迈克尔**已经试图理解你的问题。如果他误解了,错误是你的不清楚的自我解释。 – 2012-04-16 13:01:54

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(); 
} 
+0

困惑... **最终**变量,价值如何改变?这不应该是一个错误? – fireshadow52 2012-04-16 13:05:49

+0

它在构造函数 – blank 2012-04-16 13:06:23

+0

中设置好了谢谢!我现在知道了。 :) – fireshadow52 2012-04-16 13:07:36

相关问题