Загрузка класса из пути - PullRequest
       29

Загрузка класса из пути

0 голосов
/ 12 октября 2019

Я хочу создать «модули», которые расширяют интерфейс «модуля», это будут отдельные jar-файлы, которые загружаются во время выполнения - по сути, добавляя дополнительные функции. Я хочу, чтобы они были загружены как объект 'Module' (из интерфейса).

Я пробовал приведенный ниже код, и хотя мой код печатает Found module, он ничего не делает послечто.

            try {
                Collection<URL> urlList = new ArrayList<>();

                Path pluginsDir = Paths.get(Common.getPlugin().getDataFolder().getPath(), "modules");

                try (DirectoryStream<Path> jars = Files.newDirectoryStream(pluginsDir, "*.jar")) {
                    for (Path jar : jars) {
                        System.out.println("Found module (" + jar.toFile().getName() + ").");
                        urlList.add(jar.toUri().toURL());
                    }
                }


                URL[] urls = urlList.toArray(new URL[0]);

                ClassLoader pluginClassLoader = new URLClassLoader(urls, this.getClass().getClassLoader());

                ServiceLoader<Module> loader = ServiceLoader.load(Module.class, pluginClassLoader);

                for (Module module : loader) {
                    System.out.println("module.getName() = " + module.getName());
                }
            } catch (IOException ex) {
                ex.printStackTrace();
            }

Я бы ожидал, что оно напечатает имя модуля (как метод интерфейса), но оно не зацикливается.

Например, модуль будет делать;

public class ExampleModule implements Module {
    @Override
    public String getName() {
        return "Example";
    }

    @Override
    public void load() {
        Bukkit.getLogger().info("Hello!");
    }
}

Спасибо.

...