所以我試圖製作一個類似「Bukkit」插件系統的插件系統。現在看我的項目我有一些類擴展我的基類「插件」,然後我將它們添加到我的列表中。我怎樣才能做到這一點,所以我可以做到這一點,它會自動從「MODS」文件夾中加載罐子,這些文件夾擴展了我的「插件」類,並自動將它們添加到數組列表中?非常感謝你的幫助,我試圖製作一個mod loader。如何製作一個基本的插件系統/ modloader?
回答
可能有更好的方式來做到這一點,但是這是我在過去所做的那樣:
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類路徑。這應該允許其他類加載器可以訪問系統類加載器的其他類使用新加載的類。
好吧,讓我們來說,我想添加一個新的目錄,要獲得用戶名,我會做這樣的事情嗎?我從來沒有搞砸文件tbh System.getProperty(「user.name」); – user3529775
http://docs.oracle.com/javase/tutorial/essential/environment/sysprop.html –
好的,我現在有我的插件文件夾(目錄)我如何使用它來掃描他們的罐子,如果他們是一個擴展My Plugin類的類將它添加到ArrayList中。 – user3529775
您可以加載從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的接口與插件共享。通過使用這些接口,您可以輕鬆處理實現這些接口的實例。即MyClass應該實現你提供的接口MyPluginInterface。
注意:對每個插件使用ClassLoader允許您卸載ClassLoader/JAR並加載它的新版本(如果它發生更改)。
好吧,但問題是,它不會檢測罐自動添加它們。看到我想要它,所以在我的目錄文件夾中,那裏有一個類,它擴展了我的PluginLoader類以添加到我的數組列表中。 – user3529775
@ user3529775要檢測JAR,您需要一個DirectoryWatcher,只需將它指向目錄,它會告訴您何時添加,修改或刪除文件。注意:添加文件時,您需要花時間完成。即您必須等待一段時間才能停止寫入。 –
好吧,但我如何檢測到他們正在擴展我的課程(abv知道哈哈),但通過datawatcher,就像我想要的,所以它通過我的目錄中的所有罐子,檢測他們的類擴展我的插件類,然後添加他們我的arraylist。 datawatcher怎麼做? – user3529775
- 1. 如何製作「插件」評論系統
- 2. 如何爲一個網站製作一個基本的會員系統
- 3. 製作一個新的文件系統
- 4. Nutch的插件系統如何工作?
- 5. 試圖製作一個插件系統在C++/Qt
- 6. 在clojure中製作插件系統
- 7. 插件系統如何工作(wordpress,mybb ...)?
- 8. 我想安裝一些基於操作系統版本的文件和另一組基於另一個操作系統版本的文件使用wix文件
- 9. 如何製作一個基於插件的項目
- 10. 基於MEF的插件系統不能插件我的插件
- 11. 你如何計算一個基本的評分系統?
- 12. 操作系統如何控制文件?
- 13. 如何製作系統信息的WEB CGI腳本(基於BASH腳本語言)
- 14. 插件系統沒有爲每個操作系統重建?
- 15. 將rpm從一個操作系統複製到另一個操作系統
- 16. 編寫一個插件系統?
- 17. 建立一個插件系統用PHP
- 18. 如何製作一個Chrome插件
- 19. 一個乾淨的系統github頁面與本地插件
- 20. 製作一個小於系統最小值的窗口(無系統控件)?
- 21. 製作一個網站評論系統
- 22. 製作另一個CRM系統
- 23. 製作一個facebook通知系統
- 24. 基本的PHP文件上傳系統
- 25. 什麼是一個好的版本控制系統用來版本化我的整個本地文件系統?
- 26. 如何將文件從本地文件系統複製到HDFS文件系統?
- 27. 插件繼承基類的C++插件系統
- 28. 如何着手製作我自己的基本內容管理系統?
- 29. 如何製作操作系統?
- 30. 如何在php中創建一個插件系統?
使用一個URLClassLoader,並在運行時加載罐子 –
我將如何使用它來加載罐子:/?我有點知道如何使用它的加載類。 – user3529775
您不會加載JAR,而是按類加載JAR中的類。如果您想要閱讀JAR,可以通過以正常方式掃描JAR文件來完成此操作。 –