Java Reflection getDeclaredMethod(...)返回Null

时间:2014-04-14 16:36:55

标签: java reflection syntax

我导入了类的完全限定名称并创建了该类的实例。然后我继续获取该类的私有方法名称:

InvokeCallWebservice invokeCallWebservice = new InvokeCallWebservice();

Method method = null;

try {
     method = invokeCallWebservice.getClass().getDeclaredMethod("Fully Qualified Class Name.getURL", String.class);
} 
catch (SecurityException e) {
     System.out.println(e.getCause());
} 
catch (NoSuchMethodException e) {
     System.out.println(e.getCause());
}

    System.out.println(method.getName());

抛出异常,因为方法为null。我不确定可能是该类存在于不同的项目和包中的原因,还是因为我需要指定第二个参数的次数与方法中的参数一样多。我可以在私有方法上实际调用它吗?

这是堆栈跟踪:

java.lang.NoSuchMethodException: InvokeCallWebservice.getURL(java.lang.String)
at java.lang.Class.getDeclaredMethod(Class.java:1937)
at com.geico.debug.Debug.main(Debug.java:39)

3 个答案:

答案 0 :(得分:2)

Class#getDeclaredMethod(String, Object...)方法javadoc陈述

  

name参数是String,用于指定所需方法的简单名称

简单名称只是源代码中显示的方法名称,不属于它所属的类。

如果不存在此类(命名)方法,

getDeclaredMethod()将抛出NoSuchMethodException。在您的情况下,您只需打印原因,但仍尝试使用method变量,即使它未被分配。所以它仍然是null,你得到一个NPE。


如果您的方法需要5 String个参数,那么您需要使用

getDeclaredMethod("getURL", String.class, String.class, String.class, String.class, String.class);

匹配其所有参数类型。

答案 1 :(得分:1)

您必须先获得该类,并使用该类获取您想要获取的方法,仅使用方法名称和参数。

Class clazz = Class.forName("package.ClassIWant");

Method myMethod = clazz.getDeclaredMethod("getURL", String.class);

答案 2 :(得分:1)

正确的语法是:

Method method = ClassName.getClass().getDeclaredMethod(methodName, methodParameters);

此处methodName是方法的名称,methodParameters是参数数组。 将其更改为:

method = invokeCallWebservice.getClass().getDeclaredMethod("methodName", String.class);

methodName是您的方法名称。

有关详情,请参阅 this doc。