【问题标题】:Run arbitrary function from a class object in java从java中的类对象运行任意函数
【发布时间】:2013-01-27 09:01:13
【问题描述】:

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

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

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

反射或闭包与我想要实现的目标有关吗? 谢谢

【问题讨论】:

  • 如果您解释您真正想要做什么,我们或许可以为您指出更好的选择。

标签: java function reflection closures


【解决方案1】:

来自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);
    }
}

哪些输出:

你好世界:5

【讨论】:

  • 非常感谢。虽然我需要其他类的函数,但我猜你的方法也适用于它?让我先试一试,干杯!
【解决方案2】:

你可以使用reflection通过名字来调用方法,例如

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

如果您希望eval 之类的东西执行动态代码,请考虑使用JRubyGroovy

【讨论】:

  • 是的,像 eval 这样的东西可能很方便,但现在不是必须的,因为我的函数是在编译时正确定义的。感谢您提到 Groovy,我稍后会看看 :)
【解决方案3】:

答案是是的,你可以这样做,但你应该这样做吗?这种模式适用于具有一流功能的语言,但 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"));
  }
}

【讨论】:

  • 感谢您提到番石榴!我现在不需要它,但这对我来说可能是将来的事情。
猜你喜欢
  • 1970-01-01
  • 2012-08-29
  • 1970-01-01
  • 2021-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-07
  • 1970-01-01
相关资源
最近更新 更多