2012-07-04 4 views
0

Je me demande simplement s'il est possible d'invoquer une méthode par réflexion à l'intérieur d'un thread. Mon idée est de passer au constructeur du thread un nom de méthode, c'est ainsi que je voudrais spécifier ce que le thread devrait faire (quelle méthode devrait être exécutée). Le code ci-dessous ne fonctionne pas - j'obtiens une erreur "ClassNotFoundException".Réflexion Java - invoquer la méthode à l'intérieur du thread

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!"); 
      } 
     } 
    } 
} 

Quelqu'un at-il des idées pour résoudre ce problème?

+0

dans quel paquet vous avez créé cette classe 'Listener'? –

Répondre

3

Je dirais que vous n'avez pas cette classe Listener sur votre package par défaut, par conséquent, ce que vous devez faire est d'utiliser le nom complet, par exemple:

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

Le ClassNotFoundException est jeté parce qu'il doesn pas trouver Listener classe, et une raison serait le nom incomplet.


De plus, vous utilisez getMethod, cela ne fonctionnera pas avec private méthodes, s'il vous plaît utiliser getDeclaredMethod à la place.

De documentation:

getMethod - Renvoie un objet de la méthode qui reflète la méthode membre public spécifié de la classe ou de l'interface représentée par cet objet de classe .

getDeclaredMethod - Retourne un objet de la méthode qui reflète la méthode déclarée spécifiée de la classe ou de l'interface représentée par cet objet de classe.

+0

Donc vous dites que le chemin doit être pasakageName.Listener? Mon nom de package est "com.example". Quand je change en Classe c = Class.forName ("com.example.Listener"); J'obtiens l'erreur java.lang.NoSuchMethodException: com.example.Listener.waitForWindowAppear (java.lang.String). Qu'est-ce que je fais mal? –

+0

Ceci est prévu, s'il vous plaît voir mon commentaire supplémentaire –

+0

Ok, j'ai changé de méthode de privé au public et cela a fonctionné –

Questions connexes