我想知道我们是否可以在java中做这样的事情。假设我有一些成员的班级:
Class Test {
// some constructors and members
public Object func;
}
然后我从其他一些类中定义了一些函数。我想在运行时将这些函数分配给我的 Test 类,以便根据情况, eval(test.func) 可以是任何函数。你会怎么做?不过,在 javascript 中很容易完成,将函数作为字符串传递。
反射或关闭与我想要实现的目标有关吗?谢谢
我想知道我们是否可以在java中做这样的事情。假设我有一些成员的班级:
Class Test {
// some constructors and members
public Object func;
}
然后我从其他一些类中定义了一些函数。我想在运行时将这些函数分配给我的 Test 类,以便根据情况, eval(test.func) 可以是任何函数。你会怎么做?不过,在 javascript 中很容易完成,将函数作为字符串传递。
反射或关闭与我想要实现的目标有关吗?谢谢
从调用-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);
}
}
哪个输出:
你好世界:5
答案是肯定的,你可以这样做,但你应该这样做吗?这种模式适用于具有一流功能的语言,但 java 是名词王国,适用不同的模式。
当我必须使用 Java 进行函数式编程时,我会使用Google 的 Guava 库来提供帮助。我可以使用反射并坚持使用纯 Java,但我喜欢 Guava 提供的抽象。Guava 定义了一个Function 对象,它基本上是对函数的引用(具有通用输入类型和输出类型)。
class Test {
// some constructors and members
public Function func;
@Test
public void testFunc() {
assertEquals("abc", func.apply("123"));
}
}