Что вам не хватает, так это то, что URL-адреса, переданные в URLClassLoader
, должны быть каталогами, которые затем ищутся. Происходит то, что создаваемый вами URLClassLoader
на самом деле не находит файл .class, но не может найти класс и возвращается к тому, что родительский загрузчик классов загружает класс.
В частности, попробуйте изменить второй бит вашего кода так:
File classFile = new File("/eraseme");
URL url = classFile.toURL();
URL[] urls = new URL[] { url };
ClassLoader cl = new URLClassLoader(urls);
Class cls = cl.loadClass("Eraseme"); // will try to load /eraseme/Eraseme.class
TestApi test = (TestApi) cls.newInstance();
System.out.println(test.getVersion());
Обратите внимание, что если ваш класс вызывается (с пакетом) com.mycompany.erasestuff.EraseMe
, загрузчик классов будет искать в файле /eraseme/com/mycompany/erasestuff/EraseMe.class
Обратите внимание, что когда вы делаете это, вы не хотите, чтобы системный загрузчик классов мог загружать класс EraseMe
. Системный загрузчик классов будет иметь приоритет, и ваш URLClassloader
ничего не загрузит. (К сожалению, когда вы говорите загрузчику классов «загрузить этот класс», он first проверяет, может ли его родительский загрузчик классов загрузить класс, затем он пытается загрузить его сам. Если системный загрузчик классов может загрузить этот класс, вы никогда не получите другую версию)