【问题标题】:Generic List and reflection通用列表和反射
【发布时间】:2013-05-15 11:11:36
【问题描述】:

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

 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”时我使用“java.util.List”,但我不知道如何指定它。

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

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

有什么帮助吗?

附: 在调试时,我看到“List”通过以下方式解决: (Ljava/util/List;Lit/vp/SomethingStrangeFound;)V

但这对我没有帮助。

【问题讨论】:

  • 在运行时,由于类型擦除,它将是java.util.List,所以它一定不是问题。
  • partypes 数组的长度应等于 1,您也可以将代码简化为 Class partypes[] = new Class[]{List.class};
  • @Luiggi 这给我带来了一个问题,因为当我调用 getMethod("executeRule", partypes) 时,我收到一个异常:NoSuchMethodException,因为类型不同。
  • @hoaz 我在帖子中丢失了一行代码,我现在添加了:)
  • Luiggi 和 Hoaz 都是对的。

标签: java generics reflection


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    Class cls = RuleWebXmlContextParamFacesPortletRenderStyles.class;
    

    由于您收到 NoSuchMethodException,Class.forName 已经成功通过,所以这里没有错字(除非您有多个 SomethingStrangeFound 类,这意味着您弄错了包)。

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

    【讨论】:

    • 是的,你是对的,我只是搞砸了包裹。现在它似乎工作了。所有建议只使用 List.class 或 java.util.List 的人都是对的。
    【解决方案3】:

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

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

    【讨论】:

    • 对不起,我给出了删除第二个参数的代码的简化版本,因为它不会带来麻烦。但是,为了更加连贯,我再次使用这两个参数编辑了帖子。
    • @DuccioFabbri 我在编辑之前尝试了您帖子中的代码(仅使用列表作为参数)并且工作正常。也许问题出在“vp.SomethingStrangeFound”中?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-11
    相关资源
    最近更新 更多