java實(shí)現(xiàn)靜默加載Class示例代碼
前言
本文主要介紹了關(guān)于java靜默加載Class的相關(guān)內(nèi)容,之所以有這篇文章,是因?yàn)橛袝r(shí)候在開發(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è)例子:
我們先來編寫一個(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ò)亂
然后編寫測(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)代碼塊,同樣的編寫測(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)代碼塊沒有執(zhí)行,除此之外,其實(shí)我們還可以使用Class.forName(String name)的重寫方法forName(String name, boolean initialize, ClassLoader loader) ,同樣可以達(dá)到靜默加載的效果。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
Java執(zhí)行SQL腳本文件到數(shù)據(jù)庫詳解
這篇文章主要為大家詳細(xì)介紹了Java執(zhí)行SQL腳本文件到數(shù)據(jù)庫的相關(guān)方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06
使用Mybatis如何實(shí)現(xiàn)多個(gè)控制條件查詢
這篇文章主要介紹了使用Mybatis如何實(shí)現(xiàn)多個(gè)控制條件查詢,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
Java反轉(zhuǎn)字符串和相關(guān)字符編碼的問題解決
反轉(zhuǎn)字符串一直被當(dāng)作是簡(jiǎn)單問題,大家的思想主要就是利用遍歷,首尾交換字符實(shí)現(xiàn)字符串的反轉(zhuǎn)。例如下面的代碼,就可以簡(jiǎn)單實(shí)現(xiàn)反轉(zhuǎn)。2013-05-05
解決Mybatis?plus實(shí)體類屬性與表字段不一致的問題
這篇文章主要介紹了Mybatis?plus實(shí)體類屬性與表字段不一致解決方法,文末給大家提到了Mybatis-plus中數(shù)據(jù)庫表名和表字段名的相關(guān)知識(shí),需要的朋友可以參考下2022-07-07
Java數(shù)字轉(zhuǎn)中文大寫工具類詳細(xì)代碼(拿去即用)
最近項(xiàng)目中用到金額轉(zhuǎn)大寫的地方,索性給大家總結(jié)下,這篇文章主要給大家介紹了關(guān)于Java數(shù)字轉(zhuǎn)中文大寫工具類的相關(guān)資料,文中給出了詳細(xì)的代碼示例,需要的朋友可以參考下2024-05-05
使用IDEA對(duì)SpringBoot應(yīng)用進(jìn)行遠(yuǎn)程調(diào)試方式
文章介紹了如何在IDEA中對(duì)部署在服務(wù)器上的SpringBoot應(yīng)用進(jìn)行遠(yuǎn)程調(diào)試,通過配置遠(yuǎn)程調(diào)試端口和啟動(dòng)參數(shù),本地IDEA可以設(shè)置斷點(diǎn)并進(jìn)行調(diào)試2025-02-02

