Java 插件化本質是面向接口編程 + 動態加載類。將功能封裝為獨立 JAR,主程序通過反射或 ServiceLoader 機制發現並實例化插件。
public interface IPlugin {
String getName();
void execute(String param);
}
public class MyPlugin implements IPlugin {
@Override
public String getName() { return "MyPlugin"; }
@Override
public void execute(String param) { System.out.println("執行: " + param); }
}
打包為 my-plugin.jar,Manifest 包含:Plugin-Class: com.example.MyPlugin
方案 A:ServiceLoader (JDK 內建,推薦)
// META-INF/services/com.example.IPlugin 文件內容:com.example.MyPlugin
ServiceLoader loader = ServiceLoader.load(IPlugin.class);
for (IPlugin plugin : loader) {
plugin.execute("參數");
}
方案 B:自定義類加載器 (熱插拔、隔離依賴)
URLClassLoader cl = new URLClassLoader(new URL[]{new File("plugins/my-plugin.jar").toURI().toURL()});
Class> clazz = cl.loadClass("com.example.MyPlugin");
IPlugin plugin = (IPlugin) clazz.getDeclaredConstructor().newInstance();
plugin.execute("參數");
一言以蔽之:寫好接口 → 打包 JAR → 放入插件目錄 → 主程序掃描加載 → 面向接口調用。