欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java如何不通過(guò)構(gòu)造函數(shù)創(chuàng)建對(duì)象(Unsafe)

 更新時(shí)間:2024年03月25日 10:26:40   作者:子♂衿  
這篇文章主要介紹了java如何不通過(guò)構(gòu)造函數(shù)創(chuàng)建對(duì)象(Unsafe)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

java中不通過(guò)構(gòu)造函數(shù)創(chuàng)建對(duì)象

(也有說(shuō)不創(chuàng)建對(duì)象直接執(zhí)行成員方法)

這里就不和你們扯什么通過(guò) 反序列化、clone等方法了 個(gè)人覺(jué)得都是在胡扯。

如何不執(zhí)行構(gòu)造函數(shù)創(chuàng)建對(duì)象?

先來(lái)帶大家認(rèn)識(shí)一個(gè)類(lèi) sun.misc.Unsafe 該類(lèi)主要提供一些直接訪問(wèn)系統(tǒng)內(nèi)存資源等等(學(xué)過(guò)C語(yǔ)言的應(yīng)該知道和C語(yǔ)言中的指針一樣),但是由于此類(lèi)能夠直接操作內(nèi)存,這無(wú)疑也增加了程序的安全風(fēng)險(xiǎn)。所以技術(shù)不是那么好的千萬(wàn)不要在應(yīng)用中直接使用喲。

從上圖可以看出 java是不允許直接創(chuàng)建該類(lèi)對(duì)象的,但是我們可以看到第一個(gè)紅框哪里明顯有個(gè)Unsafe類(lèi)的對(duì)象,該類(lèi)是單例的。 那么怎么獲取該類(lèi)的實(shí)例呢?

注意:本版較低的jdk可能沒(méi)有這個(gè)方法

有一個(gè)getUnsafe()方法,但是很不幸,該方法是提供給jdk內(nèi)部使用的。我們直接調(diào)用該方法會(huì)拋異常的。

具體原理就是該類(lèi)會(huì)判斷當(dāng)前調(diào)用這個(gè)方法的類(lèi)是不是由Bootstrap類(lèi)加載器加載的。

那么如何獲取這個(gè)Unsafe實(shí)例呢?

有兩種方法

  • 一、讓我們使用了Unsafe對(duì)象的類(lèi)通過(guò)Bootstrap加載
  • 二、熟悉反射的同學(xué)就會(huì)心頭一冷笑,這還不簡(jiǎn)單嗎?是的,我們可以直接通過(guò)反射獲取

這里只講通過(guò)反射獲取的方式

獲取Unsafe對(duì)象

		Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe");
        theUnsafe.setAccessible(true);
        Unsafe unsafe = (Unsafe) theUnsafe.get(null);

java基礎(chǔ)好的同學(xué),這段代碼應(yīng)再熟悉不過(guò)了

不執(zhí)行構(gòu)造函數(shù)創(chuàng)建對(duì)象?

Unsafe類(lèi)中有一個(gè) sun.misc.Unsafe#allocateInstance 方法, 接收一個(gè)Class<?> 類(lèi)型對(duì)象,然后返回該類(lèi)的一個(gè)對(duì)象

我們準(zhǔn)備一個(gè)測(cè)試類(lèi)

class Test{
    private String name;
    public Test(){
        System.out.println("test construct");
    }

}

該類(lèi)構(gòu)造方法私有,然后構(gòu)造方法中打印了一句話,也就是,只要你創(chuàng)建一個(gè)新的對(duì)象就會(huì)打印這句話。

        Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe");
        theUnsafe.setAccessible(true);
        Unsafe unsafe = (Unsafe) theUnsafe.get(null);
        Test test = (Test) unsafe.allocateInstance(Test.class);

測(cè)試代碼

上面這段代碼是沒(méi)有任何輸出的,也就是沒(méi)有執(zhí)行構(gòu)造方法,但是卻返回了一個(gè)對(duì)象

因此也聽(tīng)有人說(shuō) 壓根就沒(méi)有創(chuàng)建對(duì)象, 這我也不好說(shuō)有沒(méi)有創(chuàng)建對(duì)象,因?yàn)閷?duì)于底層具體怎么實(shí)現(xiàn)的我也不造,但是我更傾向于是沒(méi)有執(zhí)行構(gòu)造方法創(chuàng)建對(duì)象這種說(shuō)法吧。

總結(jié)以及注意事項(xiàng)

通過(guò)這篇文章我們知道原來(lái)java中也提供了直接操作內(nèi)存的類(lèi),而且該類(lèi)還能不執(zhí)行構(gòu)造方法就返回一個(gè)對(duì)象,不過(guò)因此也有注意,Unsafe類(lèi)是直接操作內(nèi)存的,所以他所分配的內(nèi)存jvm的垃圾收集器是無(wú)法釋放的。該類(lèi)操作的內(nèi)存和C語(yǔ)言中一樣,要手動(dòng)釋放。

關(guān)于該類(lèi)的更多使用方式可到網(wǎng)上找相關(guān)的資料

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • JDBC連接MySQL并實(shí)現(xiàn)模糊查詢(xún)

    JDBC連接MySQL并實(shí)現(xiàn)模糊查詢(xún)

    本文詳細(xì)講解了JDBC連接MySQL并實(shí)現(xiàn)模糊查詢(xún)的方式,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-01-01
  • 在 Spring Boot 3 中接入生成式 AI的操作方法

    在 Spring Boot 3 中接入生成式 AI的操作方法

    本文介紹了如何在SpringBoot3中集成生成式AI,以O(shè)penAI的GPT模型為例,通過(guò)代碼示例展示了如何實(shí)現(xiàn),SpringBoot3的優(yōu)勢(shì)和OpenAI的生成式AI技術(shù)結(jié)合,為開(kāi)發(fā)者提供了高效集成生成式AI的方法,感興趣的朋友跟隨小編一起看看吧
    2025-01-01
  • springboot 實(shí)現(xiàn)mqtt物聯(lián)網(wǎng)的示例代碼

    springboot 實(shí)現(xiàn)mqtt物聯(lián)網(wǎng)的示例代碼

    這篇文章主要介紹了springboot 實(shí)現(xiàn)mqtt物聯(lián)網(wǎng),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • Java實(shí)現(xiàn)動(dòng)態(tài)生成GIF圖像詳解

    Java實(shí)現(xiàn)動(dòng)態(tài)生成GIF圖像詳解

    在互聯(lián)網(wǎng)上有許多有趣的場(chǎng)景,其中的一種就是動(dòng)圖。這不是視頻,而是一種GIF圖像信息。本文將利用Java實(shí)現(xiàn)動(dòng)態(tài)生成GIF圖像功能,需要的可以參考一下
    2022-09-09
  • SpringCloud微服務(wù)熔斷器Hystrix使用詳解

    SpringCloud微服務(wù)熔斷器Hystrix使用詳解

    這篇文章主要介紹了Spring Cloud Hyxtrix的基本使用,它是Spring Cloud中集成的一個(gè)組件,在整個(gè)生態(tài)中主要為我們提供服務(wù)隔離,服務(wù)熔斷,服務(wù)降級(jí)功能,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • springcloud整合gateway實(shí)現(xiàn)網(wǎng)關(guān)全局過(guò)濾器功能

    springcloud整合gateway實(shí)現(xiàn)網(wǎng)關(guān)全局過(guò)濾器功能

    本文主要介紹了springcloud整合gateway實(shí)現(xiàn)網(wǎng)關(guān)全局過(guò)濾器功能,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • java實(shí)現(xiàn)短信驗(yàn)證碼5分鐘有效時(shí)間

    java實(shí)現(xiàn)短信驗(yàn)證碼5分鐘有效時(shí)間

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)短信驗(yàn)證碼5分鐘有效時(shí)間,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • Spring AOP如何實(shí)現(xiàn)注解式的Mybatis多數(shù)據(jù)源切換詳解

    Spring AOP如何實(shí)現(xiàn)注解式的Mybatis多數(shù)據(jù)源切換詳解

    這篇文章主要給大家介紹了關(guān)于Spring AOP如何實(shí)現(xiàn)注解式的Mybatis多數(shù)據(jù)源切換的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • SpringMVC攔截器快速掌握下篇

    SpringMVC攔截器快速掌握下篇

    攔截器(Interceptor)是一種動(dòng)態(tài)攔截方法調(diào)用的機(jī)制,在SpringMVC中動(dòng)態(tài)攔截控制器方法的執(zhí)行。本文將詳細(xì)講講SpringMVC中攔截器的概念及入門(mén)案例,感興趣的可以嘗試一下
    2022-08-08
  • mybatis如何獲取剛剛新插入數(shù)據(jù)的主鍵值id

    mybatis如何獲取剛剛新插入數(shù)據(jù)的主鍵值id

    這篇文章主要介紹了mybatis如何獲取剛剛新插入數(shù)據(jù)的主鍵值id問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08

最新評(píng)論