我只是想知道是否可以通过线程内部的反射来调用方法。我的想法是向线程构造函数传递一个方法名称,这样我就可以指定线程应该做什么(应该运行哪个方法)。下面的代码不起作用 - 我得到一个错误“ClassNotFoundException”。
public class Listener extends Thread {
/** Constructor */
private static Window win = new Window();
private static Class c;
private String parameter;
public Listener(String param) {
this.parameter = param;
}
public void run() {
try {
Class c = Class.forName("Listener");
Class partypes[] = new Class[1];
partypes[0] = String.class;
Method meth = c.getMethod("waitForWindowAppear", partypes);
Listener methobj = new Listener(parameter);
Object arglist[] = new Object[1];
arglist[0] = parameter;
Object retobj = meth.invoke(methobj, arglist);
Integer retval = (Integer) retobj;
System.out.println(retval.intValue());
} catch (Exception e) {
e.printStackTrace();
}
}
/** Method waits as a thread for window at class or title */
private static void waitForWindowAppear(String title) {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException exc) {
System.out.println("Thread waitForWindowAppear has been stoped!");
return;
}
if (win.isWindowVisible(title)) {
// System.out.println("Window found!");
return;
} else {
// System.out.println("Waiting for window!");
}
}
}
}
有没有人有一些想法如何解决这个问题?
答案 0 :(得分:3)
我会说你的默认包中没有这个类Listener
,因此,你应该做的是使用完全限定的名称,例如:
Class c = Class.forName("foo.bar.Listener");
ClassNotFoundException
被抛出,因为它没有找到Listener
类,一个原因是名称不完整。
此外,您使用getMethod
,这不适用于private
方法,请改用getDeclaredMethod
。
getMethod - 返回反映指定公共的Method对象 此类表示的类或接口的成员方法 对象
getDeclaredMethod - 返回反映的Method对象 指定的类或接口所声明的声明方法 这个Class对象。