Когда хочешь расширить функционал приложения без перекомпиляции, хорошо использовать плагины. В Java можно динамически загружать классы, используя ClassLoader.
Создаём интерфейс плагина:
public interface Plugin {
void execute();
}Создаём класс плагина:
public class MyPlugin implements Plugin {
@Override
public void execute() {
System.out.println("Плагин загружен!");
}
}Реализуем кастомный ClassLoader для загрузки плагинов:
public class PluginClassLoader extends ClassLoader {
private final Path dir;
public PluginClassLoader(Path dir) {
this.dir = dir;
}
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
try {
Path file = dir.resolve(name.replace('.', '/') + ".class");
byte[] bytes = Files.readAllBytes(file);
return defineClass(name, bytes, 0, bytes.length);
} catch (IOException e) {
throw new ClassNotFoundException(name, e);
}
}
}Загружаем плагин динамически:
Path pluginDir = Path.of("plugins");
PluginClassLoader loader = new PluginClassLoader(pluginDir);
Class<?> pluginClass = loader.loadClass("MyPlugin");
Plugin plugin = (Plugin) pluginClass.getDeclaredConstructor().newInstance();
plugin.execute();Таким образом, можно добавлять новые плагины без перезапуска приложения и динамически загружать новые классы.
👉 Java Ready | #совет
