Когда вы используете Class.forName("SomeImpl")
, вы получаете класс через текущий загрузчик классов (т.е. загрузчик класса, в котором вы вызываете метод).Это также инициализирует класс.По сути, это то же самое, что и вызов Class.forName("SomeImpl", true, currentLoader)
, где currentLoader
будет загрузчиком классов вызывающей стороны.Смотрите подробности здесь .
Второй метод требует, чтобы загрузчик классов был выбран первым.Не пишите это как ClassLoader.loadClass("SomeImpl")
, так как это не статический метод.Вам потребуется что-то вроде
final ClassLoader cl = this.getClass().getClassLoader();
Class theClass = cl.loadClass("SomeImpl");
Помните, что подклассы ClassLoader должны переопределять метод findClass вместо loadClass
.Это то же самое, что вызов (защищенного) метода loadClass("SomeImpl", false)
, где второй аргумент указывает, следует ли выполнять связывание или нет.
Существуют более тонкие различия ... Метод loadClass
ожидает двоичный файлимя класса, как указано в спецификации языка Java, в то время как forName
может также использоваться со строками, представляющими примитивные типы или классы массивов.
Overal, лучше использовать Class.forName
, если необходимо указать конкретный загрузчик классов идолжен ли он быть инициализирован или нет, тогда пусть реализация выяснит все остальное.Непосредственное использование загрузчиков классов полезно для поиска ресурсов в банке или на пути к классам.