請教:應用伺服器如何識別被更新的class檔案,是透過ClassLoader嗎?
我拿Tomcat5.0.28做的試驗
public class Test{
static int a = 99;
static{
a = 5662;
System.out.println("類初始化");
}
public Test(){
System.out.println("建立了一個TTTTT的例項");
}
public static void stm(){
System.out.println("--------static-------!"+a);
}
public void m(){
System.out.println("--------nonstatic-------!"+a);
}
protected void finalize() throws Throwable {
super.finalize();
System.out.println("--------物件被釋放---------!");
}
}
將建立一個Test類的物件,放到session中,
會列印出:
類初始化
建立了一個TTTTT的例項
然後執行m方法,列印出("--------nonstatic-------!5662
然後修改Test類,將m方法改為:
public void m(){
System.out.println("----modified----nonstatic-------!"+a);
}
再次執行,列印出的就就是新的方法中的內容:----modified----nonstatic-------!5662
但是沒有列印出“類初始化”,也就是說沒有執行static初始塊。
同樣的試驗,發現static的方法也是被更新後的。
同時,我也嘗試列印出Test.class.hashcode();,發現這個值一直沒有變,這個方法是來自Object,Class類並沒有override它,還有一些發現,我總結了一下tomcat的特點:
*Tomcat會識別應用目錄下Class檔案的更新操作,並透過某種機制將新的位元組碼替代舊的位元組碼
*Tomcat不會重新載入一個類,因為static塊沒有被執行
*Tomcat動態更新不允許增加方法、減少方法、增加/減少欄位等操作。這些操作都會引起Tomcat崩潰。
至於Tomcat對servlet的更新相對就簡單一些了,畢竟servlet實現了介面,而且都是完全由容器管理的,建立、更新、再次載入在理論上也都不是什麼難事。可是對於Test這種完全自定義的類,實現動態更新讓我困擾不已。小弟嘗試從ClassLoader的角度分析這個問題,但是最後發現那樣是沒有辦法達到這種效果的。小弟也嘗試從Class類入手,現在還沒有結果,請問哪位大蝦能給小弟指點迷津,小弟不勝感激!
public class Test{
static int a = 99;
static{
a = 5662;
System.out.println("類初始化");
}
public Test(){
System.out.println("建立了一個TTTTT的例項");
}
public static void stm(){
System.out.println("--------static-------!"+a);
}
public void m(){
System.out.println("--------nonstatic-------!"+a);
}
protected void finalize() throws Throwable {
super.finalize();
System.out.println("--------物件被釋放---------!");
}
}
將建立一個Test類的物件,放到session中,
會列印出:
類初始化
建立了一個TTTTT的例項
然後執行m方法,列印出("--------nonstatic-------!5662
然後修改Test類,將m方法改為:
public void m(){
System.out.println("----modified----nonstatic-------!"+a);
}
再次執行,列印出的就就是新的方法中的內容:----modified----nonstatic-------!5662
但是沒有列印出“類初始化”,也就是說沒有執行static初始塊。
同樣的試驗,發現static的方法也是被更新後的。
同時,我也嘗試列印出Test.class.hashcode();,發現這個值一直沒有變,這個方法是來自Object,Class類並沒有override它,還有一些發現,我總結了一下tomcat的特點:
*Tomcat會識別應用目錄下Class檔案的更新操作,並透過某種機制將新的位元組碼替代舊的位元組碼
*Tomcat不會重新載入一個類,因為static塊沒有被執行
*Tomcat動態更新不允許增加方法、減少方法、增加/減少欄位等操作。這些操作都會引起Tomcat崩潰。
至於Tomcat對servlet的更新相對就簡單一些了,畢竟servlet實現了介面,而且都是完全由容器管理的,建立、更新、再次載入在理論上也都不是什麼難事。可是對於Test這種完全自定義的類,實現動態更新讓我困擾不已。小弟嘗試從ClassLoader的角度分析這個問題,但是最後發現那樣是沒有辦法達到這種效果的。小弟也嘗試從Class類入手,現在還沒有結果,請問哪位大蝦能給小弟指點迷津,小弟不勝感激!
相關文章
- 請教:如何在Servlet Web 應用中定製ClassLoader呀?ServletWeb
- class與classloader的getResourceAsStream區別
- 【nacos】透過curl語句更新配置檔案
- 爬蟲是如何被網站識別的?爬蟲網站
- 如何識別檔案的真假
- 有人在純JAVA方式下寫過操作DBF檔案的程式碼嗎?請賜教Java
- 用JAVA能做到嗎?請教!Java
- SpringBoot自定義classloader加密保護class檔案Spring Boot加密
- 請教各位,如何讀取war包中的檔案
- 請教:struts中如何使用檔案上載功能
- [提問交流]請教[段落]是指的什麼?這個該如何應用啊
- 請教這個應用技術如何實現?
- Class.forName和ClassLoader.loadClass的區別
- 請教map檔案中的主鍵
- 請教:如果透過cache來提取oracle中的資料?Oracle
- 請教,topthink是基於onethink構建的嗎?
- MAUI Blazor 如何透過url使用本地檔案UIBlazor
- 透過hexdump檢視硬碟標頭檔案的區別硬碟
- 請教伺服器是NIO的socket server問題?伺服器Server
- 請教如何應用oracle實現SimpleJdonFrameworkTest??急急急OracleFramework
- 請教windows下引數檔案的位置Windows
- 【請教】JIVE論壇安裝時資料庫檔案應當如何設定資料庫
- 【知識分享】TFTP伺服器是什麼如何下載檔案FTP伺服器
- 如何識別 Linux 上的檔案分身Linux
- [介面測試]通過Class檔案掃描來統計待測應用的介面數
- 請教四色原型應用原型
- SAP UI5 應用的 Component.js 檔案是如何在執行時被載入的?UIJS
- 如何透過.dbf檔案還原資料庫資料庫
- 請教spring 配置檔案問題Spring
- 請教關於利用跟蹤檔案重建控制檔案
- 請教一個檔案上傳的問題
- [請教] 如何把列印檔案轉換成圖片格式的問題
- 透過命名方式推送nubkg檔案到公司nuget伺服器伺服器
- 應用伺服器與資料庫伺服器是一樣的嗎?伺服器資料庫
- 【知識分享】應用伺服器和web伺服器的區別伺服器Web
- 影像識別的原理、過程、應用前景,精華篇!
- 通過二進位制頭識別檔案型別型別
- 請教:JdonFramework應用Demo程式問題Framework