Динамическое выполнение не работает, когда плагин был установлен
Я разрабатываю плагин 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, он больше не работает. Проблема в этой линии
Class thisClass = classLoader.loadClass("NewFile"); Не удается найти класс для выполнения
1 ответ
Я бы предположил, что контекстный загрузчик классов отличается при запуске в качестве плагина. Посмотрите на иерархию загрузчиков классов, полученную в вашей строке:
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
Посмотрите, отличается ли он в двух контекстах времени выполнения. Если вы можете пошагово отлаживать плагин, вы сможете изучить доступные объекты и найти среди них загрузчик классов, который работает для вашего динамического класса.
Если вы хотите использовать URLClassLoader
(который, кажется, был оставлен в вашем коде), вам нужно дать ему родителя, например:
new URLClassLoader(urls, this.getClass().getClassLoader())