通用列表和反射

时间:2013-05-14 16:29:31

标签: java generics reflection

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

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

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

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

任何帮助?

P.S。 在调试时,我看到“List&lt; Node&gt;”解决了:                (Ljava / UTIL /列表&LT; Lorg / W3C / DOM /节点;取代;点亮/ VP / SomethingStrangeFound;)V

但它对我没有帮助。

3 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:2)

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

Class cls = RuleWebXmlContextParamFacesPortletRenderStyles.class;

由于你得到NoSuchMethodException,Class.forName已经成功传递,所以没有拼写错误(除非你有多个SomethingStrangeFound类,这意味着你得到了错误的包)。

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

答案 2 :(得分:0)

对于大小为2的类型,getMethod将搜索名为“executeRule”的方法,其中包含2个参数,一个类型为“java.util.list”,另一个类型为“vp.SomethingStrangeFound”

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