Java 通用列表和反射

Java 通用列表和反射,java,generics,reflection,Java,Generics,Reflection,我想通过反射调用以下方法,但我无法指定正确的签名: public void executeRule(List<Node> params, SomethingStrangeFound callMeBack) throws IOException { ... } 它不起作用,因为我使用“java.util.List”,而它必须是“List”,但我不知道如何指定它 如果我只使用“java.util.List”,调用cls.getMethod(“executeRule”,

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

 public void executeRule(List<Node> params, SomethingStrangeFound callMeBack) throws IOException
 {
      ...
 }
它不起作用,因为我使用“java.util.List”,而它必须是“List”,但我不知道如何指定它

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

有什么帮助吗

附言。 在调试时,我看到“列表”通过以下方式解析: (Ljava/util/List;Lit/vp/somethingsquenderfound;)V


但是这对我没有帮助。

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


但是您的方法只有一个参数。您需要向方法中添加第二个类型为“vp.somethingsquendefund”的参数,或将partypes size设置为1。

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

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

 Method meth = cls.getMethod("executeRule", partypes);
Class partypes[] = new Class[] { List.class, SomethingStrangeFound.class };
Method meth = cls.getMethod("executeRule", partypes);
这将保证您没有输入错误的限定类名

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


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

Class cls = RuleWebXmlContextParamFacesPortletRenderStyles.class;
因为您得到了一个NoSuchMethodException,Class.forName已经成功传递了,所以这里没有输入错误(除非您有多个SomethingStrangefund类,这意味着您得到了错误的包)


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

在运行时,由于类型擦除,它将是
java.util.List
,因此它一定不是问题。
partypes
数组的长度应该等于1,您还可以将代码简化为
Class partypes[]=new Class[]{List.Class}
@Luiggi这给我带来了一个问题,因为当我调用getMethod(“executeRule”,partypes)时,我收到一个异常:NoSuchMethodException,因为类型不同。@hoaz我在帖子中丢失了一行代码,我现在添加了:)Luiggi和hoaz都是对的。对不起,我给出了一个简化版本的代码,删除了第二个参数,因为它不会给你带来麻烦。然而,为了更加连贯,我用这两个参数再次编辑了这篇文章。@DuccioFabbri我在编辑之前尝试了你文章中的代码(只使用列表作为参数),效果很好。也许问题出在“副总裁有什么奇怪的发现”?是的,你是对的,我只是把包裹弄乱了。现在它似乎起作用了。所有建议只使用List.class或java.util.List的人都是对的。
for (Method method : cls.getMethods()) {
    System.out.println(method);
}
Class cls = RuleWebXmlContextParamFacesPortletRenderStyles.class;