Я пытаюсь загрузить классы из динамически загружаемого файла jar. В настоящее время я могу загрузить класс, который не распространяется на класс, отличный от объекта класса root, но я не могу загрузить класс, который расширяет пользовательский класс. Подробное описание моей проблемы заключается в следующем.Загрузить класс Java с суперклассом из динамически загружаемого файла jar
В проекте А, существует класс А, как:
class A {
}
В проекте B есть класс B1 и класс В2, как:
class B1 {
}
class B2 extends A {
}
Я экспортировал проект от А до a.jar, а проект B - b.jar. Код тестирования:
File f = new File("Z:\\Jars\\b.jar");
URLClassLoader urlClassLoader = new URLClassLoader(new URL[] { f.toURL() },
System.class.getClassLoader());
Class<?> classB1 = (Class<?>) urlClassLoader.loadClass("b.B1");
System.out.println("B1 is loaded");
Class<?> classB2 = (Class<?>) urlClassLoader.loadClass("b.B2");
System.out.println("B2 is loaded");
класс В1 успешно загружен, но класс В2 не загружается из-за класса a.A не найдено исключение:
java -cp a.jar;b.jar; a.Main
B1 is loaded
Exception in thread "main" java.lang.NoClassDefFoundError: a/A
Caused by: java.lang.ClassNotFoundException: a.A
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 12 more
Как я могу решить эту проблему? Спасибо.
PS. С включением a.jar, класс В2 может быть загружен, но не следующий тест:
Class<A> classB2 = (Class<A>) urlClassLoader.loadClass("b.B2");
A ab2 = classB2.newInstance();
Первая строка это хорошо, но вторая строка срабатывает следующее исключение:
Exception in thread "main" java.lang.ClassCastException: b.B2 cannot be cast to a.A
at a.Main.main(Main.java:22)
В2 должен быть экземпляр А, любая идея, почему это произошло?
Как вы построите jar b.jar без включения класса A? Вы вручную удаляете A.class из b.jar? – Mahesh
Я использовал Eclipse, я задал проект B, чтобы он зависел от проекта A, поэтому проект B может быть построен и иметь возможность экспортировать файл jar. Для примера выше, моя проблема была решена путем включения a.jar, класс B2 может быть загружен и может быть передан A. – DeepParticle
Первый ответ в http://stackoverflow.com/questions/2591779/cast-across-classloader сказал что классы для одного и того же класса, загружаемые разными загрузчиками классов, не могут быть переброшены друг в друга. – DeepParticle