我有以下代码:
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
。
为什么会这样?
答案 0 :(得分:0)
要获取静态void main(String [] args),请使用以下
classHandle.getDeclaredMethod("main", String[].class);
可能的原因(在我们知道我们在静态无效主要之后写的)
请考虑以下事项。
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);