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クラスが見つからないためにスローされます。1つのListener理由は名前が不完全であるためです。


さらに、を使用します。これはメソッドでgetMethodは機能しません。代わりに使用してください。privategetDeclaredMethod

ドキュメントから:

getMethod-このClassオブジェクトによって表されるクラスまたはインターフェイスの指定されたパブリックメンバーメソッドを反映するMethodオブジェクトを返します。

getDeclaredMethod-このClassオブジェクトによって表されるクラスまたはインターフェイスの指定された宣言されたメソッドを反映するMethodオブジェクトを返します。

于 2012-07-04T06:52:09.097 に答える