Reflexión de Java: método de invocación dentro del hilo

Me pregunto si es posible invocar un método por reflexión dentro de un hilo. Mi idea es pasarle al constructor del subproceso un nombre de método, así es como me gustaría especificar qué debe hacer el subproceso (qué método debe ejecutarse). El siguiente código no funciona. Obtengo un error "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!");
            }
        }
    }
}

¿Alguien tiene alguna idea de cómo resolver este problema?

preguntado el 04 de julio de 12 a las 07:07

en qué paquete creaste esta clase Listener? -

1 Respuestas

Diría que no tienes esta clase. Listener en su paquete predeterminado, por lo tanto, lo que debe hacer es usar el nombre completo, por ejemplo:

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

El ClassNotFoundException se tira porque no encuentra Listener clase, y una razón sería el nombre incompleto.


Además, usas getMethod, esto no funcionará con private métodos, utilice getDeclaredMethod preferiblemente.

Desde documentación:

getMethod - Devuelve un objeto de método que refleja el método de miembro público especificado de la clase o interfaz representada por este objeto de clase.

getDeclaredMethod - Devuelve un objeto Método que refleja el método declarado especificado de la clase o interfaz representada por este objeto Clase.

Respondido 04 Jul 12, 08:07

Entonces, ¿está diciendo que la ruta debería ser pasakageName.Listener? El nombre de mi paquete es "com.example". Cuando cambio a Class c = Class.forName("com.example.Listener"); Recibo el error java.lang.NoSuchMethodException: com.example.Listener.waitForWindowAppear(java.lang.String). ¿Qué estoy haciendo mal? - señor s

Esto es de esperar, por favor vea mi comentario adicional - Francisco Spaeth

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.