Для этого нужен пользовательский загрузчик классов, и в этом загрузчике классов вам необходимо переопределить метод findClass(String name)
Пример:
public class CustomClassLoader extends ClassLoader {
final String basePath = "/your/base/path/to/directory/named/repository/";
@Override
protected Class<?> findClass(final String name) throws ClassNotFoundException {
String fullName = name.replace('.', '/');
fullName += ".class";
String path = basePath + fullName ;
try {
FileInputStream fis = new FileInputStream(path);
byte[] data = new byte[fis.available()];
fis.read(data);
Class<?> res = defineClass(name, data, 0, data.length);
fis.close();
return res;
} catch(Exception e) {
return super.findClass(name);
}
}
}
Тогда вы будете загружать классы из пользовательского местоположения. Например:
Class<?> clazz = Class.forName("my.pretty.Clazz", true, new CustomClassLoader());
Object obj = clazz.newInstance();
Делая это, вы сообщаете JVM, что класс с именем my.pretty.Clazz
должен быть загружен вашим пользовательским загрузчиком классов, который знает как и , откуда загружать ваш пользовательский класс.
Он разрешает полное имя класса (например, my.pretty.Clazz
) в имя файла (в нашем случае: /your/base/path/to/directory/named/repository/my/pretty/Clazz.class
), затем загружает полученный ресурс в виде байтового массива и, наконец, преобразует этот массив в экземпляр Class
.
Этот пример очень прост и демонстрирует общую технику загрузки пользовательских классов, как в вашем случае.
Я предлагаю вам прочитать несколько статей о загрузке классов, например this .