为什么getmethod返回null,即使该方法存在

时间:2015-03-11 21:14:19

标签: java class reflection methods

我有以下代码:

String methodName = "main";
Method[] methods = classHandle.getMethods();
for (Method m : methods)
{
    System.out.println(m.getName().equals(methodName);
}
Method classMethod = null;
try
{
    classMethod = classHandle.getMethod(methodName);
}
catch(Exception e)
{

}
System.out.println(classMethod == null);

第一次打印打印true,但第二次打印也打印true

为什么会这样?

4 个答案:

答案 0 :(得分:0)

要获取静态void main(String [] args),请使用以下

classHandle.getDeclaredMethod("main", String[].class);

可能的原因(在我们知道我们在静态无效主要之后写的)

  • Class.getMethod(name,parameters)仅返回公共方法,也许您希望将getDeclaredMethod(名称,参数)用于受保护,默认或私有方法
  • 参数不匹配。是"主要"拿任何参数?传递给getDeclaredMethod()或getMethod()的参数必须与完全匹配匹配。

请考虑以下事项。

private class Horse {
    protected void makeNoise(int level) {
    }
}

// OK
System.out.println(Horse.class.getDeclaredMethod("makeNoise", new Class<?>[]{int.class})); 

 // throws NoSuchMethodException - parameters don't match
System.out.println(Horse.class.getDeclaredMethod("makeNoise")); 

// throws NoSuchMethodException, not a public method
System.out.println(Horse.class.getMethod("makeNoise", new Class<?>[]{int.class}));

答案 1 :(得分:0)

我认为'classHandle'是一种类?

您的第一个循环仅检查方法名称,而不关心方法参数。

'public Method getMethod(String name,Class ... parameterTypes)'的完整签名告诉我们您实际上是在尝试查找名为'methodName'的0参数方法。

您确定存在具有此类名称和0参数的方法吗?

答案 2 :(得分:0)

因为方法的参数不匹配。您需要在调用getMethod()时指定参数类型。

答案 3 :(得分:0)

getMethods method返回所有Method的数组,并且您只检查名称。对于main,它将返回true,但对于从false继承的所有方法,它将返回Object

当您仅使用方法名称作为参数调用getMethod method时,您要求的Method不带参数。

main只有一个String[]参数,因此getMethod会引发NoSuchMethodException。你正在抓住它,但却无所事事。 (你正在“吞下”异常,通常是一个坏主意。)因此,classMethod仍为null并输出true

要查找main,请将参数的类型作为附加参数传递:

Method classMethod = classHandle.getMethod(methodName, String[].class);