Java反射,其中方法参数是接口

Big*_*c66 5 java reflection interface

首先让我说我正在维护别人设计糟糕的代码,所以我可以改变它的程度有限。

现在发生的事情是他们创建了一系列由反射调用的方法。其中一种方法将 Map 作为其参数之一。在运行时,这个 Map 是用 Hashtable 实现的。

这是问题 - 我得到一个 NoSuchMethodException 因为它正在寻找一个以 Hashtable 作为参数的方法,即使 Hashtable 实现了 Map 接口。让我感到困惑的是,如果我不使用反射(在这种情况下是一个主要的设计更改)并传递了一个 Hashtable,它将使用 Map 参数调用该方法 - 那么为什么当我使用反射时它的工作方式不一样?

鉴于我几乎必须坚持使用反射,当我将实现该接口的类传递给它时,有什么方法可以让带有 Map 参数的方法被调用?

如果你愿意,我可以模拟一些代码来演示......

gaw*_*awi 5

如果使用getMethod(String name, Class[] parameterTypes)from java.lang.Class,则需要指定接口的方法签名中表示的参数类型(静态类型),而不是运行时对象的类型(动态类型)。

因此,对于methodXyz(Map map), 而不是:

Method m = cl.getMethod("methodXyz", new Class[]{argument.getClass()});
Run Code Online (Sandbox Code Playgroud)

做这个:

Method m = cl.getMethod("methodXyz", new Class[]{Map.class});
Run Code Online (Sandbox Code Playgroud)