我已将方法添加到arraylist并尝试在main中调用方法(ui.mList.get(0)参见代码示例1)来执行但java不执行任何方法。但是,我发现其他示例代码执行方法如下所示(参见代码示例2),但是当我运行代码系统时显示异常
class UserLogin{
List<String> mList = new ArrayList();
public void testAnswerCorrect(){
//My code
}
public void listMethodsUsingReflection(){
Class personClass = UserLogin.class;
Method[] methods = personClass.getDeclaredMethods();
int i=0;
for (Method method : methods) {
if(method.getName().toString().contains("test")){
mList.add(i,method.getName());
i++;
}
}
}
public static main(String arg[]){
UserLogin ul = new UserLogin();
ul.listMethodsUsingReflection();
ul.mList.get(0);
}
在代码上运行不会做任何事情。
Object obj = null;
UserLogin ul = new UserLogin();
ul.listMethodsUsingReflection();
String className = "com.test.script.UserLogin";
Class c = Class.forName(className);
obj = c.newInstance();
Class[] argTypes = new Class[] { String[].class };
String sMethod =ul.mList.get(0).toString();
Method method = c.getDeclaredMethod(sMethod, argTypes);
method.invoke(obj, null);
在代码系统上运行会产生异常:
Exception in thread "main" java.lang.NoSuchMethodException:com.test.script.UserLogin.testAnswerCorrect([Ljava.lang.String;)
at java.lang.Class.getDeclaredMethod(Unknown Source)
at com.test.script.UserLogin.main(UserLogin.java:180)
缺少某些东西或者还有其他方法可以执行方法。另外,我将在数组列表中添加所有方法,这些方法将从xml文件中读取并需要动态执行代码。用户在编写测试脚本/代码时将给出方法名称。
我很感激您的意见
谢谢,
答案 0 :(得分:1)
对于这个例子,我假设你有 列表methodList;
在methodNames中已满。(此方法不带参数
for (int i = 0 ; i < methodNames.size() ; i++) {
Class cls = UserLogin.class;
Method method = cls.getDeclaredMethod(methodNames.get(i));
Object returnObject = method.invoke(c.newInstance(), new Object[]{});
}
它应该是那样的东西.AS你可以看到,Get声明的方法不应该像你写的那样使用String []。你的方法没有得到anyParameter ..所以无法找到,因为你定义了使用参数String []获取方法 首先,你得到你的特定方法的类,然后你通过她的名字的字符串创建方法,比你需要调用你的方法并获得返回对象..如果你有参数你需要填补新的
Object[]{}
希望有所帮助
答案 1 :(得分:0)
testAnswerCorrect()
方法不带任何参数,而您反复尝试访问方法testAnswerCorrect(String[])
。如果你改变了行
Class[] argTypes = new Class[] {String[].class};
到
Class[] argTypes = new Class[0];
然后它应该工作。请注意,testAnswerCorrect()
和testAnswerCorrect(String[])
被视为不同的方法。您试图获取采用String[]
的方法,并且该方法不存在。
或者,你可以得到这样的方法:
Method method = c.getDeclaredMethod(sMethod);
然后您根本不必创建Class[]
。