public class ReflectionTest {
public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {
// TODO Auto-generated method stub
ReflectionTest t = new ReflectionTest();
Method method[]= t.getClass().getMethods();
System.out.println(method.length);
for(int i=0;i<=method.length;i++){
method[i].invoke(t);
}
}
public void abc(){
System.out.println("abc");
}
public void xyz(){
System.out.println("XYZ");
}
}
结果显示:
abc
xyz
Exception in thread "main" java.lang.IllegalArgumentException: wrong number of arguments
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.selenium.test.ReflectionTest.main(ReflectionTest.java:21)
请帮我解决这个问题
答案 0 :(得分:3)
错误是因为除了abc()和xyz()之外,还有很多其他方法。
equals
hashCode
toString
abc
xyz
getClass
notify
notifyAll
wait
如果要运行方法,可以使用以下逻辑
for(int i=0;i<method.length;i++){
if(method[i].getName().equals("abc") || method[i].getName().equals("xyz"))
{
method[i].invoke(t);
}
}
答案 1 :(得分:1)
如果我理解了您的问题,则需要跳过调用main
(因为它需要String[] args
)和Object
的其他方法,即
ReflectionTest t = new ReflectionTest();
Method method[] = t.getClass().getMethods();
System.out.println(method.length);
for (int i = 0; i < method.length; i++) {
if (method[i].getName().equals("abc") || method[i].getName().equals("xyz")) {
try {
method[i].invoke(t, null);
} catch (Exception e) {
e.printStackTrace();
}
}
}
似乎在这里正常工作。
答案 2 :(得分:0)
问题在于
for(int i=0;i<=method.length;i++){
method[i].invoke(t);
}
迭代直到i
具有与method.length相同的值。
因为数组以0开头,而method.length从1开始计算。
您必须迭代到i<method.length
或i<=method.length-1
例如。
方法[]有一个项目。
method[0] <- first and only item
method.length <- will return 1 becuase there is only one item.
你可以说:
method[method.length-1] <- this will be the last item.
答案 3 :(得分:0)
再想一想你在做什么。
迭代你的类中可用的所有公共方法(包括在超类中声明的方法)并尝试不带参数调用,即假设所有方法都不接受任何绝对错误的参数。例如,从equals(Object)
继承的wait(long)
或java.lang.Object
需要一个参数。
修改
同样是关于你自己的方法main(String[])
。
偶尔getMethods()
会返回前两个不需要参数的方法:成功调用abc()
和xyz()
。然后转向main()
到达而你失败了。但即使你添加一些if()
语句来忽略main
,你也会因为我已经提到的Object
继承的方法失败了。
如果您只想尝试在课程中声明的方法,请使用getDeclaredMethods()
代替getMethods()
。
答案 4 :(得分:0)
当您尝试调用需要参数而不提供任何参数的方法时会发生错误。
对于一般解决方案,您可能需要对此进行测试:
if (method[i].getParameterTypes().length ==0)
{
method[i].invoke(t);
}
这测试方法是否有参数并跳过它
请参阅here