如何制作基本的插件系统/ modloader?

时间:2014-06-26 18:40:50

标签: java plugins loader

所以我试图创建一个类似于" Bukkit"的插件系统。插件系统。现在看我的项目我有一些类扩展我的基类"插件"然后我将它们添加到我的列表中。我怎样才能做到这一点,我可以做到这一点,所以它自动加载来自" mods"扩展我的"插件"的文件夹类并自动将它们添加到arraylist?非常感谢你的帮助,我试图制作一个mod加载器。

2 个答案:

答案 0 :(得分:0)

可能有更好的方法可以做到这一点,但这是我过去所做的:

    private static final String JAVA_CLASS_PATH_PROPERTY = "java.class.path";
    private static final String CUSTOM_CLASS_PATH_PROPERTY = "custom.class.path";


public static void addPath(String s) throws Exception {
        File f = new File(s);
        URL u = f.toURI().toURL();
        URLClassLoader urlClassLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();
        Class<URLClassLoader> urlClass = URLClassLoader.class;
        Method method = urlClass.getDeclaredMethod("addURL", new Class[] { URL.class });
        method.setAccessible(true);
        method.invoke(urlClassLoader, new Object[] { u });

        if (System.getProperties().containsKey(CUSTOM_CLASS_PATH_PROPERTY)) {
            StringBuilder sb = new StringBuilder();
            sb.append(System.getProperty(CUSTOM_CLASS_PATH_PROPERTY));
            sb.append(File.pathSeparatorChar);
            sb.append(s);
            System.setProperty(CUSTOM_CLASS_PATH_PROPERTY, sb.toString());
        }
        else {
            StringBuilder sb = new StringBuilder();
            sb.append(System.getProperty(JAVA_CLASS_PATH_PROPERTY));
            sb.append(File.pathSeparatorChar);
            sb.append(s);
            System.setProperty(JAVA_CLASS_PATH_PROPERTY, sb.toString());
        }
    }

这会将jar(s param)的路径添加到URLS的系统类加载器列表中,然后将jar路径附加到自定义类路径的末尾(如果存在),否则将其附加到java类路径。这应该允许其类加载器可以到达系统类加载器的任何其他类使用新加载的类。

答案 1 :(得分:0)

您可以从JAR加载类但使用ClassLoader

URL jarUrl = ...;
URLClassLoader loader = new URLClassLoader(new URL[] { jarUrl });
Class myClass = Class.forName("myjar.mypackage.MyClass", true, loader);
MyPluginInterface myPlugin = myClass.asSubClass(MyPluginInterface.class).newInstance();

myClass将是jar中的一个类。您很可能需要与插件共享的JAR接口。通过使用这些接口,您可以轻松处理实现这些接口的实例。即MyClass应该实现MyPluginInterface,这是你提供的接口。

注意:对每个插件使用ClassLoader允许您卸载ClassLoader / JAR并加载它的新版本,如果它改变了。