Java反射 - 调用线程内部的方法

时间:2012-07-04 06:43:55

标签: java multithreading reflection methods invoke

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

有没有人有一些想法如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

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

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

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


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

来自documentation

  

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

     

getDeclaredMethod - 返回反映的Method对象   指定的类或接口所声明的声明方法   这个Class对象。