2013-02-12 52 views
0

我想知道在java中是否可以这样做。 说我有一些成员的类:从java中的类对象运行任意函数

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

,然后我已经从一些其它类中定义的某些功能。我想在运行时将这些函数分配给我的Test类,以便根据情况,eval(test.func)可以是任何函数。你会怎么做? 虽然在JavaScript中使用字符串来传递函数很容易。

是反射还是闭合与我想达到的目的有关? 谢谢

+0

如果你解释你真的想要做什么,我们可能会指出你更好的选择。 – 2013-02-12 05:41:51

回答

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

+0

非常感谢。虽然我需要来自其他类的函数,但我想你的方法也适用于此类?让我先试一下,欢呼! – user1589188 2013-02-12 06:18:07

+0

欢迎您:) – 2013-02-12 08:13:29

1

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

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

如果你想要像eval执行动态代码,考虑JRubyGroovy

+0

是的,像eval这样的东西可以很方便,但它不是必须在这一刻,因为我的功能在编译时已正确定义。感谢提Groovy,稍后我会看看:) – user1589188 2013-02-12 06:16:44

1

答案是肯定的,您可以做到这一点,但你应该?这种模式适用于具有一流功能的语言,但java是Kingdom of Nouns,适用不同的模式。

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

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

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

谢谢你提到番石榴!在这一点上我不需要它,但这对我来说可能是未来的事情。 – user1589188 2013-02-12 06:15:06