java實(shí)現(xiàn)靜默加載Class示例代碼
前言
本文主要介紹了關(guān)于java靜默加載Class的相關(guān)內(nèi)容,之所以有這篇文章,是因?yàn)橛袝r(shí)候在開(kāi)發(fā)的時(shí)候,我們有這樣的場(chǎng)景,我們只想得到一個(gè)Class的基本信息,但是并不想觸發(fā)相關(guān)的靜態(tài)代碼塊,在之前的一篇《JAVA掃描包》文章中就用到了這種方式,我將其稱之為靜默加載,如果有專業(yè)的叫法,歡迎指正。
一般情況下,我們加載一個(gè)Class的時(shí)候會(huì)使用Class.forName(String name)
方法,該方法會(huì)返回一個(gè)Class對(duì)象,同時(shí)會(huì)觸發(fā)該類中的靜態(tài)代碼塊,舉個(gè)例子:
我們先來(lái)編寫(xiě)一個(gè)只包含靜態(tài)代碼塊的Bean類。
package com.jinggujin.classloader; public class Bean { static { System.err.println("static code block."); } }
使用err流是為了讓信息及時(shí)輸出,使用out會(huì)有緩存,可能會(huì)導(dǎo)致輸出信息順序錯(cuò)亂
然后編寫(xiě)測(cè)試方法進(jìn)行測(cè)試。
package test; import org.junit.Test; public class ClassLoaderTest { @Test public void test() throws Exception { Class.forName("com.jinggujin.classloader.Bean"); } }
運(yùn)行觀察控制臺(tái)輸出:
static code block.
此時(shí)控制臺(tái)會(huì)輸出我們?cè)陟o態(tài)代碼塊中打印的內(nèi)容,這樣就證明了了在使用Class.forName(String name)
會(huì)觸發(fā)靜態(tài)代碼塊,那么,要實(shí)現(xiàn)靜默加載,我們就不能用這種方式了,我們可以使用ClassLoader的loadClass(String name)
方法進(jìn)行加載,該方法僅會(huì)加載類而不會(huì)觸發(fā)靜態(tài)代碼塊,同樣的編寫(xiě)測(cè)試方法進(jìn)行測(cè)試。
package test; import org.junit.Test; public class ClassLoaderTest { @Test public void test() throws Exception { Class<?> clazz = Thread.currentThread().getContextClassLoader().loadClass("com.jinggujin.classloader.Bean"); System.err.println(clazz.getName()); } }
運(yùn)行觀察控制臺(tái)輸出:
com.jinggujin.classloader.Bean
我們發(fā)現(xiàn),在控制臺(tái)中僅輸出了我們打印的類名信息,而靜態(tài)代碼塊沒(méi)有執(zhí)行,除此之外,其實(shí)我們還可以使用Class.forName(String name)
的重寫(xiě)方法forName(String name, boolean initialize, ClassLoader loader)
,同樣可以達(dá)到靜默加載的效果。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
Java?中的?clone(?)?和?new哪個(gè)效率更高
很多朋友不太清楚clone()和new那個(gè)更快?針對(duì)這個(gè)問(wèn)題我百度了好多資料,最終小編總結(jié)下關(guān)于Java?中的?clone(?)?和?new哪個(gè)效率更高的問(wèn)題,感興趣的朋友跟隨小編一起看看吧2021-12-12基于java實(shí)現(xiàn)簡(jiǎn)單發(fā)紅包功能
這篇文章主要為大家詳細(xì)介紹了基于java實(shí)現(xiàn)簡(jiǎn)單發(fā)紅包功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-11-11Java解析調(diào)用webservice服務(wù)的返回XML串詳解
這篇文章主要介紹了Java解析調(diào)用webservice服務(wù)的返回XML串詳解的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07通過(guò)代碼示例了解submit與execute的區(qū)別
這篇文章主要介紹了通過(guò)代碼示例了解submit與execute的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09springboot-mybatis/JPA流式查詢的多種實(shí)現(xiàn)方式
這篇文章主要介紹了springboot-mybatis/JPA流式查詢,本文給大家分享三種方式,每種方式結(jié)合示例代碼給大家講解的非常詳細(xì),需要的朋友可以參考下2022-12-12