【发布时间】:2017-08-09 07:37:26
【问题描述】:
假设有一个名为doTask 的重载方法:
public class Game {
void doTask(Joker joker);
void doTask(Batman batman, Robin robin);
}
我想调用正确的方法,给定方法的名称 ("doTask") 和一个参数数组,其数量和类型是先验未知的。
通常,这至少涉及三个步骤:
1.求参数个数及其类型,组成数组Class[] myTypes。
2.识别正确的重载Method,即Method rightMethod = game.getClass().getMethod("doTask", myTypes);
3.调用方法:rightMethod.invoke(paramArray)。
是否存在一种工具可以让 Java 反射自动识别要使用的正确重载方法,从而使我们免于执行步骤 1 和 2?我认为理想情况是:Library.invoke("doTask", paramArray);
【问题讨论】:
-
这听起来有点不对劲。你想在这里达到什么目的?为什么不知道参数的数量?你从哪里得到它们?它们有什么形式?当你不知道参数的数量时,你怎么能确定有一个具有正确数量参数的实现呢?是否可以将参数列表直接传递给
doTask()并让实现决定如何处理它们? -
重载:带有一些最小的设计气味。反射:更大的气味。长话短说:您打算在这里解决的根本问题是什么?
-
lupz 和 GhostCat,我同意你的观点,如果我从头开始编写整个项目,就不会这样写。就目前而言,
doTask()方法已经被编写(并被其他代码使用)。我正在编写一个包装函数myFunc(Object... paramArray),带有额外的业务逻辑,以调用正确的doTask()。 -
另一种选择当然是为每个重载的
doTask()方法编写一个单独的包装器。但这会重复大部分业务逻辑代码,并且难以维护。 -
这个
business logic对所有参数都一样吗?如果否,那么您已经可以识别应该使用一个包装方法调用哪个doTask()。
标签: java reflection overloading