Re: [問題] static block

看板java作者 (小犬)時間11年前 (2014/07/06 01:50), 編輯推噓7(7030)
留言37則, 9人參與, 最新討論串2/2 (看更多)
※ 引述《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 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.161.193.19 ※ 文章網址: http://www.ptt.cc/bbs/java/M.1404582657.A.670.html

07/06 03:08, , 1F
請問一下static block是被載入的時候就被執行
07/06 03:08, 1F

07/06 03:09, , 2F
不被 Instance 跟Destory影響嗎?
07/06 03:09, 2F

07/06 04:16, , 3F
基本上是 不過如果第一次new出instance
07/06 04:16, 3F

07/06 04:16, , 4F
"可能"是他第一次被載入,所以時間可能相近
07/06 04:16, 4F

07/06 04:16, , 5F
Destory後又無參照 也"可能"被GC unload
07/06 04:16, 5F

07/06 04:17, , 6F
之後再使用"可能"又會在載入一次
07/06 04:17, 6F

07/06 10:19, , 7F
請問一下,初始化static member使用,那類別的成員各自
07/06 10:19, 7F

07/06 10:19, , 8F
加上static修飾詞不就好了..?
07/06 10:19, 8F

07/06 15:12, , 9F
某種方面上可以把它當成class的constructor
07/06 15:12, 9F

07/06 15:47, , 10F
八卦一下, 某公司面試Java考題這個考很兇...
07/06 15:47, 10F

07/07 02:42, , 11F
其實95%的人只有在JNI會用到這個....
07/07 02:42, 11F

07/07 02:42, , 12F
static block的invoke時間跟Classloader完全相關
07/07 02:42, 12F

07/07 02:43, , 13F
最好他們生意做那麼大 每個都馬需要改自己的classloader
07/07 02:43, 13F

07/07 02:46, , 14F
基本上大多數只有自己實作DI Framework才會想碰那塊
07/07 02:46, 14F

07/07 10:14, , 15F
也要意識到 web context 也是自己獨立的 classloader
07/07 10:14, 15F

07/07 14:24, , 16F
我改過 class loader XDDD ,不過是為了做 runtime sandbox
07/07 14:24, 16F

07/07 14:25, , 17F
當時的目標是可以線上直接寫 class 還有更新,所以在
07/07 14:25, 17F

07/07 14:25, , 18F
classloader 跟 runtime compile 那邊下了不少苦心。XDDD
07/07 14:25, 18F

07/07 14:34, , 19F
可是真正enterprise上需求真的很少見 他們考這不知幹嘛
07/07 14:34, 19F

07/07 14:35, , 20F
想搞自己的熱插拔就可能改 (aka 實做自己的) Classloader
07/07 14:35, 20F

07/07 14:36, , 21F
不過反正有 load 就會跑到, 應該沒影響?
07/07 14:36, 21F

07/07 15:45, , 22F
「熱插」做的到,「熱拔」不行。必須用一些很tricky的方
07/07 15:45, 22F

07/07 15:46, , 23F
法(比方說動態指定class name)才能逼classloader
07/07 15:46, 23F

07/07 15:46, , 24F
去unload一個class,Native Library也有一樣的問題
07/07 15:46, 24F

07/07 15:47, , 25F
這東西要熱插拔搞到最後就是一個半吊子 很討厭的
07/07 15:47, 25F

07/07 15:47, , 26F
正常情況下除非ref=0加上強制GC 否則他無法unload
07/07 15:47, 26F

07/07 15:50, , 27F
值得一提的是OSGi有重新寫一個Classloader做的到
07/07 15:50, 27F

07/07 15:59, , 28F
熱拔...就直接把 classloader 拔掉 (然後全重插) XDD
07/07 15:59, 28F

07/07 16:06, , 29F
問題在於他會讓你重新load一個同名但是改過的模組出問題
07/07 16:06, 29F

07/07 16:07, , 30F
你沒辦法動態產生.class放進去 :/
07/07 16:07, 30F

07/07 16:07, , 31F
當初在Native Library為這點吃足苦頭 結果.class都是...
07/07 16:07, 31F

07/07 16:37, , 32F
這讓我想到我之前分享的東西 http://goo.gl/twDuI7
07/07 16:37, 32F

07/07 16:50, , 33F
等等 我看懂了 原來樓上兩樓說的是拔classloader XD
07/07 16:50, 33F

07/07 16:51, , 34F
居然還有這招 怎麼那麼靠背啊 XDDDDD
07/07 16:51, 34F

07/07 17:34, , 35F
可以插了又拔,拔了再插。很有趣滴。
07/07 17:34, 35F

07/07 17:44, , 36F
是的, 因為不能只換張椅子只好整棟樓重蓋這樣 @@
07/07 17:44, 36F

07/07 18:15, , 37F
真的是學到了 閒聊也能學到這種東西 XD 感謝大家
07/07 18:15, 37F
文章代碼(AID): #1Jk3i1Pm (java)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
文章代碼(AID): #1Jk3i1Pm (java)