0

我只是想知道是否可以通过线程内的反射来调用方法。我的想法是将方法名称传递给线程构造函数,这样我就可以指定线程应该做什么(应该运行哪个方法)。下面的代码不起作用 - 我收到错误“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!");
            }
        }
    }
}

有谁知道如何解决这个问题?

4

1 回答 1

3

我会说你的 Default 包上没有这个类Listener,因此,你应该做的是使用完全限定的名称,例如:

Class c = Class.forName("foo.bar.Listener");

ClassNotFoundException抛出是因为它没有找到Listener类,原因之一是名称不完整。


此外,您使用getMethod,这不适用于private方法,请getDeclaredMethod改用。

文档

getMethod - 返回一个 Method 对象,该对象反映此 Class 对象表示的类或接口的指定公共成员方法。

getDeclaredMethod - 返回一个 Method 对象,该对象反映此 Class 对象表示的类或接口的指定声明方法。

于 2012-07-04T06:52:09.097 回答