Приведение типов Java - PullRequest
       11

Приведение типов Java

1 голос
/ 30 августа 2011

У меня есть три файла:

ScriptProcessor.java:

public interface ScriptProcessor {
   public String someMethod();
}

ScriptProcessorDummy.java:

public class ScriptProcessorDummy implements ScriptProcessor {
   public String someMethod{
       return "some string";
   }
}

В методе main код выполняет следующее:

URLClassLoader loader = null;
loader = new URLClassLoader(new URL[] {new URL("JARFILE")});
if (loader != null) {
   ScriptProcessor processor = (ScriptProcessor) loader.loadClass("ScriptProcessorDummy").newInstance();
}

«JARFILE» содержит файлы классов ScriptProcessor и ScriptProcessorDummy.

Код работает нормально при использовании JDK 1.4, но при использовании JDK 1.5, приведения типов (к ScriptProcessor) происходит сбой с Java.lang.ClassCastException.

Может кто-нибудь сказать, пожалуйста, как это исправить.

Спасибо, Радж

Ответы [ 2 ]

1 голос
/ 30 августа 2011

Вам нужно сделать ваш текущий загрузчик классов родителем нового загрузчика классов, который вы загружаете, и убедиться, что в вашем банке нет копии интерфейса.

Ваша проблема предполагает, что у вас есть две копии интерфейса: одна в загрузчике основного класса, другая в новой. Возвращаемый объект использует тот, который находится в отдельном банке, но ваш класс использует основной. Они не одинаковы. Вы должны убедиться, что Java использует тот же «.class» для интерфейса при обработке загруженного класса, что и при компиляции вашего кода.

Первое, что нужно сделать, это «jar tf» на банке и посмотреть, верна ли моя гипотеза о двух экземплярах. Если так, удалите это. Попробуйте запустить. Если вы получили NoClassDef, исправьте конструкцию загрузчика.

new URLClassLoader(urlArray, Thread.currentThread().getContextClassLoader());

при условии, что ваша среда поддерживает загрузчик классов контекста. С другой стороны,

new URLClassLoader(urlArray, ScriptProcessor.class.getClassLoader());
0 голосов
/ 30 августа 2011

Попробуйте использовать:

loader.loadClass("ScriptProcessorDummy", true).newInstance();

логическое значение, чтобы загрузчик классов разрешил имя класса.

...