我导入了类的完全限定名称并创建了该类的实例。然后我继续获取该类的私有方法名称:
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)
答案 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。