2

我想通过反射调用以下方法,但我无法指定正确的签名:

 public void executeRule(List<Node> params, SomethingStrangeFound callMeBack) throws IOException
 {
      ...
 }

我试过这样的事情:

 Class partypes[] = new Class[2];
 partypes[0] = Class.forName("java.util.List");                 
 partypes[1] = Class.forName("vp.SomethingStrangeFound");

 Method meth = cls.getMethod("executeRule", partypes);

它不起作用,因为当它必须是“List<Node>”时我使用“java.util.List”,但我不知道如何指定它。

如果我只使用“java.util.List”,调用 cls.getMethod(“executeRule”,partypes) 时会出现以下错误:

 NoSuchMethodException: vp.RuleWebXmlContextParamFacesPortletRenderStyles.executeRule(java.util.List, vp.SomethingStrangeFound)

有什么帮助吗?

PS 在调试时,我看到“List<Node>”通过以下方式解决:(Ljava/util/List<Lorg/w3c/dom/Node;>;Lit/vp/SomethingStrangeFound;)V

但这对我没有帮助。

4

3 回答 3

3

如果两个参数类在编译时都可用,您可以像这样初始化参数数组:

Class partypes[] = new Class[] { List.class, SomethingStrangeFound.class };
Method meth = cls.getMethod("executeRule", partypes);

这将保证您没有输入错误的合格类名。

如果这仍然不起作用,请使用 Class#getMethods() 方法检查类中的可用方法:

for (Method method : cls.getMethods()) {
    System.out.println(method);
}
于 2013-05-14T17:37:08.587 回答
2

我运行了你的代码,它对我有用。您没有提供 cls 的定义,但我认为它类似于

Class cls = RuleWebXmlContextParamFacesPortletRenderStyles.class;

因为你得到一个 NoSuchMethodException,Class.forName 已经成功通过,所以没有错字(除非你有多个 SomethingStrangeFound 类,这意味着你弄错了包)。

因此,我想到的最后一件事是,也许您在添加相关方法之前编译了 RuleWebXmlContextParamFacesPortletRenderStyles。清理代码并重新编译。

于 2013-05-14T17:51:22.523 回答
0

对于大小为 2 的派对,getMethod 将搜索一个名为“executeRule”的方法,该方法有 2 个参数,一个是“java.util.list”类型,另一个是“vp.SomethingStrangeFound”类型

但是您的方法只有 1 个参数。您需要在您的方法中添加第二个类型为“vp.SomethingStrangeFound”的参数或将partypes 大小设置为1。

于 2013-05-14T16:46:14.947 回答