Re: [問題] static block

作者: jetswayss (小犬)   2014-07-06 01:50:54
※ 引述《gn00618777 (非常念舊)》之銘言:
: 類別(class)中可以有static 程式區塊,static 程式區塊在類別第一次被載入後只會
: 被執行一次,此區塊在類別變數初始化之前執行。
: 書上只淺淺的一行帶過...
: 所以...類別是會被載入之後再載出,重複載入的意思囉?
: 還有這 static block 的使用時機是啥阿? 謝謝。
這邊主要有兩個概念
Classloader和Initializing Fields
Classloader
java Classloader是Java運行時環境的一部分,
負責動態載入Java類到Java虛擬機的內存空間中。
類通常是按需載入,即第一次使用該類時才載入。
(引自維基百科)
為了空間效能等等,通常是需要時才載入
不必要時也可能載出
所以是會有重複載出載入的情形
static block
static block主要是用來當Initializing Field使用
也就是初始化使用static member使用
而使用時機可能是
1.需要載入共用資源
2.下載.讀取一些共用資料
參考資料:
http://en.wikipedia.org/wiki/Java_Classloader
http://docs.oracle.com/javase/tutorial/java/javaOO/initial.html
作者: Deltaguita (貝里斯)   2014-07-06 03:08:00
請問一下static block是被載入的時候就被執行不被 Instance 跟Destory影響嗎?
作者: jetswayss (小犬)   2014-07-06 04:16:00
基本上是 不過如果第一次new出instance"可能"是他第一次被載入,所以時間可能相近Destory後又無參照 也"可能"被GC unload之後再使用"可能"又會在載入一次
作者: gn00618777 (非常念舊)   2014-07-06 10:19:00
請問一下,初始化static member使用,那類別的成員各自加上static修飾詞不就好了..?
作者: jetswayss (小犬)   2014-07-06 15:12:00
某種方面上可以把它當成class的constructor
作者: NewSpec (新規格)   2014-07-06 15:47:00
八卦一下, 某公司面試Java考題這個考很兇...
作者: Killercat (殺人貓™)   2014-07-07 02:42:00
其實95%的人只有在JNI會用到這個....static block的invoke時間跟Classloader完全相關最好他們生意做那麼大 每個都馬需要改自己的classloader基本上大多數只有自己實作DI Framework才會想碰那塊
作者: qrtt1 (有些事,有時候。。。)   2014-07-07 10:14:00
也要意識到 web context 也是自己獨立的 classloader
作者: TonyQ (自立而後立人。)   2014-07-07 14:24:00
我改過 class loader XDDD ,不過是為了做 runtime sandbox當時的目標是可以線上直接寫 class 還有更新,所以在classloader 跟 runtime compile 那邊下了不少苦心。XDDD
作者: Killercat (殺人貓™)   2014-07-07 14:34:00
可是真正enterprise上需求真的很少見 他們考這不知幹嘛
作者: lovdkkkk (dk)   2014-07-07 14:35:00
想搞自己的熱插拔就可能改 (aka 實做自己的) Classloader不過反正有 load 就會跑到, 應該沒影響?
作者: Killercat (殺人貓™)   2014-07-07 15:45:00
「熱插」做的到,「熱拔」不行。必須用一些很tricky的方法(比方說動態指定class name)才能逼classloader去unload一個class,Native Library也有一樣的問題這東西要熱插拔搞到最後就是一個半吊子 很討厭的正常情況下除非ref=0加上強制GC 否則他無法unload值得一提的是OSGi有重新寫一個Classloader做的到
作者: lovdkkkk (dk)   2014-07-07 15:59:00
熱拔...就直接把 classloader 拔掉 (然後全重插) XDD
作者: Killercat (殺人貓™)   2014-07-07 16:06:00
問題在於他會讓你重新load一個同名但是改過的模組出問題你沒辦法動態產生.class放進去 :/當初在Native Library為這點吃足苦頭 結果.class都是...
作者: popcorny (畢業了..@@")   2014-07-07 16:37:00
這讓我想到我之前分享的東西 http://goo.gl/twDuI7
作者: Killercat (殺人貓™)   2014-07-07 16:50:00
等等 我看懂了 原來樓上兩樓說的是拔classloader XD居然還有這招 怎麼那麼靠背啊 XDDDDD
作者: qrtt1 (有些事,有時候。。。)   2014-07-07 17:34:00
可以插了又拔,拔了再插。很有趣滴。
作者: lovdkkkk (dk)   2014-07-07 17:44:00
是的, 因為不能只換張椅子只好整棟樓重蓋這樣 @@
作者: Killercat (殺人貓™)   2014-07-07 18:15:00
真的是學到了 閒聊也能學到這種東西 XD 感謝大家

Links booklink

Contact Us: admin [ a t ] ucptt.com