Java插件化开发

首发于Enaium的我的博客java


在java程序开发过程当中. 可能须要加载插件的功能. 因此要动态加载Jar文件来实现插件的加载.git

我这边用了Kotlingithub

一. 建立接口

interface PluginInitializer {
    fun onInitialize()//插件初始化
}

二. 加载插件

加载的插件可能会抛出什么异常因此要用tryjson

private val file = File("plugins")
private val plugins: ArrayList<PluginInitializer> = ArrayList()

init {
    try {
            if (file.listFiles().isNotEmpty()) {
                for (f in file.listFiles()) {
                    if (f.name.endsWith(".jar") {//判断文件后缀是否为.jar
                        val u = URLClassLoader(arrayOf<URL>(f.toURL()), Thread.currentThread().contextClassLoader)//加载Jar
                        plugins.add(u.loadClass("cn.enaium.plugin.Test").newInstance() as PluginInitializer)//加载主类
                    }
                }
            }

            if (plugins.isNotEmpty()) {
                for (p in plugins) {
                    p.onInitialize()//初始化插件
                }
            }
        } catch (e: Exception) {

    }
}

三. 写插件

public class Test implements PluginInitializer {

    @Override
    public void onInitialize() {
        System.out.println("HELLO WORLD!");
    }

}

导入Jar而后放入插件目录就能够加载了.框架

这个主类是固定的 如何把他改成随意的呢?ide

  1. 咱们能够在在每个插件的文件里面都指定一个配置的json里面 而后加载Jar的时候能够用getResourceAsStream来获取中的配置

好比 获取配置中的mainClass就能够了插件

{
    "mainClass": "cn.enaium.plugin.Test"
}
  1. 还能够经过注解来查找主类 只要自定义一个注解好比@Plugin 而后遍历Jar文件中所有类中也没用这个 注解就能够找出这个类

四. 使用BullPlugin框架

这么麻烦有没有更简单的方法呢?code

我写了一个加载插件的框架 就是经过寻找指定注解来 查找主类的blog

相关文章
相关标签/搜索