2011-07-21 94 views
3

所以我正在製作一個服務器,很像IRC,只是爲了學習更多,這是我的問題。在URLClassLoader中禁用緩存

我有每個人可以根據他們的權利調用的命令,每個「命令」都有它自己的類,它們都位於一個目錄中。我將所有的類加載到一個HashMap中,並且如果我添加NEW命令,它會很好,但如果我更改舊的,則沒有任何更改。

那麼,如何使用URLClassLoader加載類而不緩存它們呢?

感謝您的任何幫助。

這是我使用

ClassLoader loader = new URLClassLoader(scriptURLS); 
     try { 
      for(URL u : scriptURLS) { 
       if(u == null) continue; 
       String fileName = u.getFile(); 
       int beginIndex = fileName.indexOf("commands/") + 9; 
       int endIndex = fileName.indexOf(".c"); 
       fileName = fileName.substring(beginIndex, endIndex); 
       String name = fileName.toLowerCase(); 
     Class<Command> c = (Class<Command>) loader.loadClass("chat.commands."+fileName); 

的代碼,我意識到這不是最乾淨的還是最高效的代碼在那裏,但它的工作原理。

回答

0

您應該非常小心地創建自己的類加載器,因爲內存中的循環引用可能會使PermGen空間快速耗盡,從而阻止垃圾收集器回收先前的加載器所佔用的空間(這是要小心的事情如果您決定轉儲您的ClassLoader並在每次需要重新加載命令時創建一個新的)。如何在這裏發生的更多信息:

http://www.zeroturnaround.com/blog/rjc201/

如果您還沒有準備好,你應該看一看JRebel的。有一個許可費,但我認爲它可能會解決你的問題:

http://www.zeroturnaround.com/jrebel/

而且,Java的熱插拔(用於Java調試API)可以有鉤,以方便你這個熱重新部署行爲尋找(通常在IDE環境中可用)。

我不完全理解你的用例,說實話(爲什麼你必須在運行時加載Command類,爲什麼你需要熱部署行爲)。