一个方法public int operate()从外面接受一个String参数,该String参数实际上是operate()的函数体。能否实现?

解决方案 »

  1.   

    可能表达得不清楚,举个例子吧。
    String expression = "if(param>5) return 1;else return 0;";public int operate(){
        int param = 10;
        //这里的语句是expression的值;这样,operate()将返回1
    }
      

  2.   


    A strange requirement...
      

  3.   

    可以的.
    用MVEL包,他相当于javascript中的eval
      

  4.   

    或者提取出完整的class,然后利用java.lang.Compiler
      

  5.   

    不可以将语句作为字符串传入,没有像 JavaScript 的 eval 函数的功能。目前版本的 JDK 这种功能无法实现,只能按照 2 楼所说的使用接口或抽象类什么的。只有等到下一个版本 JDK,即在使用 JDK 7 中的闭包可以实现类似的功能。public int operate({int => int} action) {
      int param = 10;
      return action.invoke(param);
    }int num = operate({int x => if(x > 5) 1; else 0;});
      

  6.   

    面向函数编程...Java支持了吗?
      

  7.   

    首先保证你的jdk版本1.6以上:    ScriptEngineManager scriptEngineMgr = new ScriptEngineManager();
        ScriptEngine jsEngine = scriptEngineMgr.getEngineByName("JavaScript");    if (jsEngine == null) {
            System.err.println("No script engine found for JavaScript");
            System.exit(1);
        }
        engine.eval(
            "function sayHello(name) {" +
            "    println('Hello, ' + name)" +
            "}"
        );
        engine.eval("sayHello('World!')");World得部分可以用外界参数替代。
    不过,由于对于jdk版本要求太高,就算是开发出来了,也不见得会有多大实用性
      

  8.   


    public interface A{
        public int method();
    }
    public static int operate(final int i,A a){ 
        return a.method();

    public static void main(String[] args){
        int ret = operatie(5,new A(){
            //在这里实现A中的方法就可以
            public int method(){}{
                //下面就是你要写的字符窜
                if(i>5) return 1;else return 0;
            }
        });
    }
      

  9.   

    什么叫“该String参数实际上是operate()的函数体”????-----我感觉我的理解能力太糟糕了!
      

  10.   

    楼主说的是动态语言的一种特性,java目前的版本好像并不能直接支持。不过java还是有办法实现的,方法比较复杂一点,思路基本上是先将你的这个字符串编译成字节码,然后修改你的这个class文件,把那些字节码插入到指定位置,用自己定制的classloader载入内存即可。
      

  11.   

    在http://www.beanshell.org/download.html, download最新版本
    import bsh.Interpreter;public class Test
    {
        public static void main(String args[])
        {
            Interpreter interpreter = new Interpreter();
            String s = "System.out.println(\"hello\")";
            try 
            {
             interpreter.eval(s); 
            }
            catch (Throwable t)
            {
                t.printStackTrace();
            }
        }
    }
    简单把
      

  12.   

    學過編譯原理沒?自己寫個script interpreter
      

  13.   


            Interpreter interpreter = new Interpreter();
            String s = "public class Hello {";
            s += " public Hello() {System.out.println(\"Hello\");}";
            s += "}";
            try 
            {
             interpreter.eval(s); 
             interpreter.eval("new Hello()");
            }
            catch (Throwable t)
            {
                t.printStackTrace();
            }
           还可以这样动态生成加载类
           
      

  14.   

    java已经强到这个地步啦!不过这种功能应该用得很少,除非很特殊的情况。