Когда именно выбрасывается NoClassDefFoundError? - PullRequest
0 голосов
/ 05 мая 2011

Как точно работают зависимости времени выполнения в Java. Например, возможен ли подобный код, если Impl1 или Impl2 не находятся в пути к классам во время выполнения:

Thinger t;
if (classIsAvailable(Impl1.class)) t = new Impl1();
else t = new Impl2();
t.doThing();

Или, если нет общего интерфейса:

if (classIsAvailable(Impl1.class)) Impl1.doThingThisWay();
else Impl2.doThingTheOtherWay();

Ответы [ 3 ]

3 голосов
/ 05 мая 2011

Вы не можете сделать это в точности так, потому что для оценки Impl1.class указанный класс должен быть доступен (т.е. загружен). Однако вы можете попробовать загрузить определенный класс по имени

 Class aClass = classLoader.forName("Impl1");

Если это не дает сбоя (сгенерировать исключение), вы можете создать экземпляр этого класса, используя newInstance().

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

В этой статье приведен пример кода.

2 голосов
/ 05 мая 2011

ClassNotFoundException генерируется, когда приложение пытается загрузить класс через его строковое имя, используя:

* The forName method in class Class.
* The findSystemClass method in class ClassLoader .
* The loadClass method in class ClassLoader. 

но определение класса с указанным именем не найдено.

Вы также можете найти http://www.xyzws.com/javafaq/what-does-classforname-method-do/17 полезным.

НТН

0 голосов
/ 05 мая 2011

Ваш пример потерпит неудачу с NoClassDefFoundError, если ваш класс загружен либо Impl1, либо Impl2, но не в пути к классам, поэтому в этом случае ни один код не будет выполнен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...