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