2013-06-16 1 views
2

Я разрабатываю плагин Eclipse, который запускает текущий активный файл. Я использую этот методДинамическое выполнение не работает, когда был установлен плагин

public static void runIt(String fileToCompile,String packageName) throws ClassNotFoundException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, InstantiationException, SecurityException, NoSuchMethodException 
    { 

     File file = new File(fileToCompile); 

     try 
     { 
      // Convert File to a URL 
      URL url = file.toURL(); // file:/classes/demo 
      URL[] urls = new URL[] { url }; 

      // Create a new class loader with the directory 
      ClassLoader loader = new URLClassLoader(urls); 

      ClassLoader classLoader = Thread.currentThread() 
        .getContextClassLoader(); 

      Class<?> thisClass = classLoader.loadClass("NewFile"); 
      Object newClassAInstance = thisClass.newInstance(); 
      Class params[] = new Class[1]; 
      params[0]=String[].class; 
      Object paramsObj[] = {}; 
      String m=null; 
      Object instance = thisClass.newInstance(); 
      Method thisMethod = thisClass.getDeclaredMethod("main", params); 
      String methodParameter = "a quick brown fox"; 
      // run the testAdd() method on the instance: 
      System.out.println((String)thisMethod.invoke(instance,(Object)m)); 



     } 
     catch (MalformedURLException e) 
     { 
     } 

    } 

Но это работает, когда я «Запуск Eclipse, приложение» [запустить плагин в другом окне Eclipse,], но когда я установил плагин в Eclipse, он больше не работает. Проблема заключается в этой строке

Класс thisClass = classLoader.loadClass ("NewFile"); Невозможно найти класс, который должен быть выполнен

+0

Что 'packageName' означает? –

ответ

0

Я бы предположил, что при загрузке в качестве плагина используется класс classloader. Посмотрите на иерархию загрузчика классов, полученных в вашей линии:

ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 

Смотрите, если она отличается в двух контекстах во время выполнения. Если вы можете выполнить отладку плагина, вы сможете исследовать доступные объекты и найти среди них класс-загрузчик, который работает для вашего динамического класса.

Если вы хотите использовать URLClassLoader (который, как представляется, были оставлены в вашем коде), вы должны дать ему родитель, как:

new URLClassLoader(urls, this.getClass().getClassLoader())