2012-07-04 3 views
0

Мне просто интересно, можно ли вызвать метод отражением внутри потока. Моя идея состоит в том, чтобы передать конструктору потока имя метода, так что я хотел бы указать, что должен делать поток (какой метод должен выполняться). Код ниже не работает - я получаю сообщение об ошибке «ClassNotFoundException».Java reflection - метод вызова внутри потока

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

У кого-нибудь есть идеи, как решить эту проблему?

+0

В каком пакете вы создали этот класс 'Listener'? –

ответ

3

Я бы сказал, вы не имеете этот класс Listener на вашем умолчанию пакет, поэтому, что вы должны сделать, это использовать полное имя, например:

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

ClassNotFoundException выбрасывается, потому что это Безразлично Найти Listener класс, и одна из причин была бы неполным именем.


Кроме того, вы используете getMethod, это не будет работать с private методами, пожалуйста, используйте getDeclaredMethod вместо этого.

От documentation:

getMethod - Возвращает объект метода, который отражает заданную общую метод члена класса или интерфейса, представленного этим классом объекта.

getDeclaredMethod - Возвращает объект метода, который отражает указанный объявленный метод класса или интерфейса, представленного этого объекта класса.

+0

Итак, вы говорите, что путь должен быть pasakageName.Listener? Имя моего пакета - «com.example». Когда я перехожу к классу c = Class.forName ("com.example.Listener"); Я получаю ошибку java.lang.NoSuchMethodException: com.example.Listener.waitForWindowAppear (java.lang.String). Что я делаю не так? –

+0

Ожидается, пожалуйста, см. Мой дополнительный комментарий –

+0

Хорошо, я изменил метод от частного к публичному, и он работал –

Смежные вопросы