通用列表和反射



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

 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);

它不起作用,因为我使用了"java.util"。当它必须是"List"时,但我不知道如何指定它。

如果我只使用"java.util。"列表",我有以下错误调用类。getMethod("executeRule",partypes):

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

帮忙吗?

注:在调试时,我看到"List"被解析为:(Ljava/util/List

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

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);
}

我运行了你的代码,它为我工作。您没有提供cls的定义,但我假设它类似于

Class cls = RuleWebXmlContextParamFacesPortletRenderStyles.class;

因为你得到一个NoSuchMethodException, Class。forName已经成功传递,所以没有打字错误(除非你有多个somethingstrangeffound类,这意味着你得到了错误的包)。

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

对于大小为2的partypes, getMethod将搜索一个名为"executeRule"的方法,该方法有两个参数,其中一个类型为"java.util "。列出"和其他类型"vp。SomethingStrangeFound "

但是你的方法只有一个参数。您需要添加第二个类型为"vp"的参数。

相关内容

  • 没有找到相关文章