从java中的类对象运行任意函数

时间:2013-02-12 05:32:23

标签: java function reflection closures

我想知道我们是否可以在java中做这样的事情。 假设我有一些成员的课程:

Class Test {
  // some constructors and members
  public Object func;
} 

然后我从一些其他类定义了一些函数。我想在运行时将这些函数分配给我的Test类,以便根据情况,eval(test.func)可以是任何函数。你会怎么做? 但是在javascript中很容易完成,将函数作为字符串传递。

反射或闭合是否与我想要达到的目标相关? 谢谢

3 个答案:

答案 0 :(得分:2)

来自calling-a-method-named-string-at-runtime-in-java-and-c

在java中,它可以通过反射api来完成。

查看Class.getMethod(String methodName, Class... parameterTypes)

一个完整的例子(带有参数的非静态方法)将是:

import java.lang.reflect.*;

public class Test {

    public String methodName(int i) {
        return "Hello World: " + i;
    }

    public static void main(String... args) throws Exception {
        Test t = new Test();
        Method m = Test.class.getMethod("methodName", int.class);
        String returnVal = (String) m.invoke(t, 5);
        System.out.println(returnVal);
    }
}

哪个输出:

  

Hello World:5

答案 1 :(得分:1)

您可以使用reflection按名称调用该方法,例如

Method myMethod = getClass().getMethod("methodName",MyClass.class);
myMethod.invoke(classObj);

如果您想要eval之类的内容来执行动态代码,请考虑JRubyGroovy

答案 2 :(得分:1)

答案是,你可以这样做,但是你应该这样做吗?这种模式适用于具有一流功能的语言,但java是Kingdom of Nouns,并且适用不同的模式。

当我绝对需要在Java中进行函数式编程时,我使用Google's Guava libraries来帮助。我可以使用反射并坚持使用纯Java,但我喜欢Guava提供的抽象。 Guava定义了Function object,它基本上是对函数的引用(具有通用输入类型和输出类型)。

class Test {
  // some constructors and members
  public Function func;

  @Test
  public void testFunc() {
    assertEquals("abc", func.apply("123"));
  }
}