2017-01-03 14 views
0

Я создал класс Utility для отражения Java. Что мое intension, если имя метода передано как аргумент, тогда оно должно вернуть значение Collecton. Класс утилиты создается в проекте Eclipse Plugin (com.abc.utility). Я добавил этот класс утилиты к другому проекту плагина (com.abc.dao). Теперь, когда я называю этот метод, я получаю ClassNotFoundException. Я понял проблему. Я не хочу добавлять зависимость от классов к проекту com.abc.utility. Скорее com.abc.utility проект плагина должен добавить как зависимость от других проектов.classnotfound exception reflection

Я не знаю, как ressolve. Не могли бы вы помочь мне в этом.

@SuppressWarnings({ "unchecked", "rawtypes" }) 
    public <K>Collection<K> getCollection(T t, String methodName) { 

     Method[] methods =t.getClass().getMethods();   

     for (Method method : methods) {   
      String name = method.getName(); 
      if (name.equals(methodName)) { 
       String name2 = method.getReturnType().getName(); 
       Object newInstance = null; 
       try { 
        newInstance = Class.forName(name2).newInstance(); 
       } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e1) { 
        e1.printStackTrace(); 
       } 
       if (newInstance instanceof Collection) { 
        try { 
         return (Collection)method.invoke(t, null); 
        } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { 
         e.printStackTrace(); 
        } 
       } 

      } 
     } 

     return Collections.emptyList(); 
    } 

ответ

0

Вы не можете этого сделать. Каждый плагин Eclipse имеет отдельный путь к классу, поэтому в плагине com.abc.utilityClass.forName будет работать только для классов в плагине или его зависимостях. Другие классы не будут находиться в пути класса плагина, и они не смогут их найти.

Вы можете загружать классы в другие плагины, но только если вы знаете плагин, содержащий класс. Для этого вы используете:

Bundle bundle = ... bundle for the plugin containing the class 

Class<?> theClass = bundle.loadClass("class name"); 

Вы можете получить Bundle от плагина идентификатору с помощью:

Bundle bundle = Platform.getBundle("plugin id");