簡體   English   中英

Java,運行時類重裝

[英]Java, runtime class reloading

我正在尋找一種在運行時將類重新加載到Java中的方法。 目的是使調試更加有效。 該應用程序是典型的客戶端/服務器設計,可以同步處理請求。 為每個請求實例化一個“處理程序”對象。 這是我打算動態替換的唯一類。 由於每個請求都處理一個新實例,因此重新加載此類不會有任何副作用。 簡而言之,我不想每次對該模塊進行更改時都重新啟動整個應用程序。

在我的設計中,Java進程意識到請求之間的類路徑中的.class文件已更新。 發生這種情況時,將卸載“ handler”類並加載一個新的類。

我知道我可以使用classLoader接口加載新類。 我似乎在尋找正確的“卸載”方法時遇到了麻煩。

如果沒有剩余的引用,將像其他任何對象一樣卸載類並進行垃圾回收。 這意味着必須沒有該類的可訪問實例(由該特定的classloader實例加載),並且該classloader實例本身也必須符合垃圾回收的條件。

因此,基本上,您要做的就是創建一個新的類加載器實例以加載該類的新版本,並確保不保留對舊版本實例的引用。

我相信您實際上需要具有一個類加載器的層次結構,並且要重新加載,實際上要擺脫低級類加載器(通過常規的GC手段),從而擺脫它加載的所有類。 據我所知,Java EE應用程序服務器使用此技術來重新加載應用程序,當在一個類加載器中加載的框架代碼想要使用在其他地方加載的類時,就會有各種有趣的結果。

從2015年開始,java的類重載也是一個缺少的功能。

  • 使用OSGi創建類重載應用程序。
  • 使用jrebel進行測試。 還有其他一些人做同樣的事情。
  • 使用應用程序服務器並將要重新加載的部分外部化到單獨的Web應用程序中。 然后繼續部署/取消部署。 由於舊的ClassLoader實例懸而未決,您最終將獲得一些perm gen空間溢出錯誤。
  • 使用腳本運行器執行可變代碼的一部分。 JSR-223 Java腳本API支持腳本語言“ Java”。

我寫了一系列有關類重載的文章。 但是所有這些方法都不適合生產。

恕我直言,此類的重裝在Java中很雜亂,不值得嘗試。 但是我非常希望這是java中的規范。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM