Java反射:根据参数和签名自动调用正确的重载方法

2024-02-21

假设有一个名为的重载方法doTask:

public class Game {
  void doTask(Joker joker);
  void doTask(Batman batman, Robin robin);
}

我想调用正确的方法,给定方法的名称("doTask")和一个参数数组,其数量和类型事先未知。

通常,这至少涉及三个步骤:
1. 找到参数的个数和类型,并制作一个数组Class[] myTypes.
2. 识别正确的重载Method, i.e. Method rightMethod = game.getClass().getMethod("doTask", myTypes);
3.调用方法:rightMethod.invoke(paramArray).

是否存在一种工具可以要求 Java 反射自动识别要使用的正确重载方法,并使我们不必执行步骤 1 和 2?我认为理想情况下,这会是这样的:
Library.invoke("doTask", paramArray);


有这样一个设施,java.beans.Statement https://docs.oracle.com/javase/8/docs/api/?java/beans/Statement.html, resp. Expression https://docs.oracle.com/javase/8/docs/api/?java/beans/Expression.html如果需要返回值:

Game game = new Game();
Joker joker = new Joker();
Statement st = new Statement(game, "doTask", new Object[]{ joker });
st.execute();

然而,它仅适用于public方法。

另外,与java.lang.reflect.Method,该设施尚未适应支持varargs参数,因此您必须手动创建参数数组。

可以证明,它可以根据参数类型选择正确的目标方法,而参数类型不一定与参数类型相同:

ExecutorService es = Executors.newSingleThreadExecutor();
class Foo implements Callable<String> {
    public String call() throws Exception {
        return "success";
    }
}
// has to choose between submit(Callable) and submit(Runnable)
// given a Foo instance
Expression ex = new Expression(es, "submit", new Object[]{ new Foo() });
Future<?> f = (Future<?>)ex.getValue();
System.out.println(f.get());
es.shutdown();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java反射:根据参数和签名自动调用正确的重载方法 的相关文章

随机推荐