2014-06-26 38 views
0

所以我試圖製作一個類似「Bukkit」插件系統的插件系統。現在看我的項目我有一些類擴展我的基類「插件」,然後我將它們添加到我的列表中。我怎樣才能做到這一點,所以我可以做到這一點,它會自動從「MODS」文件夾中加載罐子,這些文件夾擴展了我的「插件」類,並自動將它們添加到數組列表中?非常感謝你的幫助,我試圖製作一個mod loader。如何製作一個基本的插件系統/ modloader?

+0

使用一個URLClassLoader,並在運行時加載罐子 –

+0

我將如何使用它來加載罐子:/?我有點知道如何使用它的加載類。 – user3529775

+0

您不會加載JAR,而是按類加載JAR中的類。如果您想要閱讀JAR,可以通過以正常方式掃描JAR文件來完成此操作。 –

回答

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類路徑。這應該允許其他類加載器可以訪問系統類加載器的其他類使用新加載的類。

+0

好吧,讓我們來說,我想添加一個新的目錄,要獲得用戶名,我會做這樣的事情嗎?我從來沒有搞砸文件tbh System.getProperty(「user.name」); – user3529775

+0

http://docs.oracle.com/javase/tutorial/essential/environment/sysprop.html –

+0

好的,我現在有我的插件文件夾(目錄)我如何使用它來掃描他們的罐子,如果他們是一個擴展My Plugin類的類將它添加到ArrayList中。 – user3529775

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的接口與插件共享。通過使用這些接口,您可以輕鬆處理實現這些接口的實例。即MyClass應該實現你提供的接口MyPluginInterface。

注意:對每個插件使用ClassLoader允許您卸載ClassLoader/JAR並加載它的新版本(如果它發生更改)。

+0

好吧,但問題是,它不會檢測罐自動添加它們。看到我想要它,所以在我的目錄文件夾中,那裏有一個類,它擴展了我的PluginLoader類以添加到我的數組列表中。 – user3529775

+0

@ user3529775要檢測JAR,您需要一個DirectoryWatcher,只需將它指向目錄,它會告訴您何時添加,修改或刪除文件。注意:添加文件時,您需要花時間完成。即您必須等待一段時間才能停止寫入。 –

+0

好吧,但我如何檢測到他們正在擴展我的課程(abv知道哈哈),但通過datawatcher,就像我想要的,所以它通過我的目錄中的所有罐子,檢測他們的類擴展我的插件類,然後添加他們我的arraylist。 datawatcher怎麼做? – user3529775

相關問題