我想通过反射调用以下方法,但是我有问题指定正确的签名:
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
但它对我没有帮助。
答案 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。