如何在使用反射将对象插入Set后调用Set中可运行对象中的run方法



我试图调用Runnable对象的run()方法,我不明白为什么它不起作用。这样做的目的是创建各种可运行对象的集合,并将其添加到set中,然后用它们的run()方法一次调用它们。你能帮我理解我做错了什么吗?

下面是我的代码:
public class WebDriverThreadsManager 
{
    private int numOfFireFoxThreads = 0;
    private Set<Runnable> webDriversSet = new HashSet<Runnable>();

    public WebDriverThreadsManager(){}
    public void addWebDriversToSeperateThreadsSet(String i_NameOfBrowser) throws ClassNotFoundException, InstantiationException, IllegalAccessException
    {
         Class cls;
        switch (i_NameOfBrowser)
        {
            case "FireFox":
            {
                cls = Class.forName("SeleniumLerning.ThreadedFireFoxWebDriver");
                numOfInstancesToAddToThreadsSet(cls,this.getNumOfFireFoxThreads());
            }
            default:
            throw new IllegalStateException("Unknown Browser");
    }
    private void numOfInstancesToAddToThreadsSet(Class cls, int numOfInsances) throws InstantiationException, IllegalAccessException
    {
       for(int i=0 ; i < numOfInsances ; i++)
        {
            Object obj = cls.newInstance();
            this.webDriversSet.add((Runnable)obj);
        } 
    }
    public void invokeWebDrivers()
    {
       Iterator iter = this.webDriversSet.iterator();
       //Method method;
       while (iter.hasNext()) 
      {
         try 
         {
              Method  method = iter.getClass().getDeclaredMethod("run");
              method.invoke(iter.getClass());
         } 
         catch (NoSuchMethodException ex) 
        {
            Logger.getLogger(WebDriverThreadsManager.class.getName()).log(Level.SEVERE, null, ex);
        } 
        catch (SecurityException ex) 
        {
            Logger.getLogger(WebDriverThreadsManager.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            Logger.getLogger(WebDriverThreadsManager.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IllegalArgumentException ex) {
            Logger.getLogger(WebDriverThreadsManager.class.getName()).log(Level.SEVERE, null, ex);
        } catch (InvocationTargetException ex) {
            Logger.getLogger(WebDriverThreadsManager.class.getName()).log(Level.SEVERE, null, ex);
        } 
    }
}

}

public void Main()
  {
      public static void main(String args[])
      {
           WebDriverThreadsManager manager = new  WebDriverThreadsManager();
           manager.setNumOfFireFoxThreads(5);
           addWebDriversToSeperateThreadsSet("FireFox");
           invokeWebDrivers();
      }
 }

我不明白为什么你用反射把它们弄得这么复杂,不使用反射也可以做到。

但是如果出于某种原因你需要使用反射,这可能是你在try中需要的,

     try 
     {
          Object object = iter.next();
          Method  method = object.getClass().getDeclaredMethod("run");
          method.invoke(object);
     } 

注意:你也提到过,

然后一次调用所有的

这里真的不需要反射。你有一个漂亮的Set<Runnable>,为什么不利用它,像这样:

// No messy try-catch blocks required anymore :)
for(Runnable runnable : this.webDriversSet) {
    runnable.run();
}

但是,您还应该知道,在一个可运行程序上直接调用run()不会自动执行不同线程上的可运行程序列表,它们只会在当前线程上顺序运行。

Java: Thread start()和Runnable run()有什么区别

如果你的意图是在不同的线程中启动所有可运行程序,以便它们并行运行,那么你可以这样做:

for(Runnable runnable : webDriversSet) {
    new Thread(runnable).start();
}

最新更新