假设有一个名为的重载方法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(使用前将#替换为@)