首發於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
getResourceAsStream
來獲取中的配置好比 獲取配置中的mainClass
就能夠了插件
{ "mainClass": "cn.enaium.plugin.Test" }
@Plugin
而後遍歷Jar文件中所有類中也沒用這個 註解就能夠找出這個類這麼麻煩有沒有更簡單的方法呢?code
我寫了一個加載插件的框架 就是經過尋找指定註解來 查找主類的blog