java實現(xiàn)靜默加載Class示例代碼
前言
本文主要介紹了關于java靜默加載Class的相關內(nèi)容,之所以有這篇文章,是因為有時候在開發(fā)的時候,我們有這樣的場景,我們只想得到一個Class的基本信息,但是并不想觸發(fā)相關的靜態(tài)代碼塊,在之前的一篇《JAVA掃描包》文章中就用到了這種方式,我將其稱之為靜默加載,如果有專業(yè)的叫法,歡迎指正。
一般情況下,我們加載一個Class的時候會使用Class.forName(String name)
方法,該方法會返回一個Class對象,同時會觸發(fā)該類中的靜態(tài)代碼塊,舉個例子:
我們先來編寫一個只包含靜態(tài)代碼塊的Bean類。
package com.jinggujin.classloader; public class Bean { static { System.err.println("static code block."); } }
使用err流是為了讓信息及時輸出,使用out會有緩存,可能會導致輸出信息順序錯亂
然后編寫測試方法進行測試。
package test; import org.junit.Test; public class ClassLoaderTest { @Test public void test() throws Exception { Class.forName("com.jinggujin.classloader.Bean"); } }
運行觀察控制臺輸出:
static code block.
此時控制臺會輸出我們在靜態(tài)代碼塊中打印的內(nèi)容,這樣就證明了了在使用Class.forName(String name)
會觸發(fā)靜態(tài)代碼塊,那么,要實現(xiàn)靜默加載,我們就不能用這種方式了,我們可以使用ClassLoader的loadClass(String name)
方法進行加載,該方法僅會加載類而不會觸發(fā)靜態(tài)代碼塊,同樣的編寫測試方法進行測試。
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()); } }
運行觀察控制臺輸出:
com.jinggujin.classloader.Bean
我們發(fā)現(xiàn),在控制臺中僅輸出了我們打印的類名信息,而靜態(tài)代碼塊沒有執(zhí)行,除此之外,其實我們還可以使用Class.forName(String name)
的重寫方法forName(String name, boolean initialize, ClassLoader loader)
,同樣可以達到靜默加載的效果。
總結
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關文章
springboot-mybatis/JPA流式查詢的多種實現(xiàn)方式
這篇文章主要介紹了springboot-mybatis/JPA流式查詢,本文給大家分享三種方式,每種方式結合示例代碼給大家講解的非常詳細,需要的朋友可以參考下2022-12-12