假設,我只有靜態方法的類。將類加載到內存時,類加載器是否會加載每個導入的類?或者只有當這個方法需要訪問它時纔會加載導入?classLoader何時加載導入?
問題是當類加載到內存時,或者在某些方法想要使用它們之前,類加載器是否加載導入。 如果是第一個選項,我可能需要將我的一些Util類,更多專用。
假設,我只有靜態方法的類。將類加載到內存時,類加載器是否會加載每個導入的類?或者只有當這個方法需要訪問它時纔會加載導入?classLoader何時加載導入?
問題是當類加載到內存時,或者在某些方法想要使用它們之前,類加載器是否加載導入。 如果是第一個選項,我可能需要將我的一些Util類,更多專用。
我想你可以按如下測試:
package pkg1;
public class Test {
static {
System.out.println("Hello 111");
}
public static void meth() {
System.out.println("Hello 222");
}
}
測試1:
package pkg2;
import pkg1.Test;
public class Tester {
public static void main(String... args) {
Test t;
}
}
,打印什麼。
測試2:
package pkg2;
import pkg1.Test;
public class Tester {
public static void main(String... args) {
Test.meth();
}
}
打印:
Hello 111 Hello 222
所以,僅僅因爲你已經輸入一個類並不意味着類加載器將加載類到內存。它在使用時會動態加載它。
我沒有聲稱知道很多關於類加載器的知識,但是如果你在談論導入語句,那麼類加載器是無關緊要的。
導入語句的存在純粹是爲了讓開發人員使用簡短的類名,而不是寫入的類中引用的每個類的完全限定名。編譯器很早就使用這些導入語句來在創建一行字節碼之前解析被引用類的名稱。
通常情況下,帶有報告(即打印語句)的類文件頂部的靜態代碼塊會讓您很清楚何時在特定應用程序中發生加載。但是,當處理動態類,內部靜態類或類動態加載的類路徑時,您必須小心 - 因爲這些類實際上可能會在應用程序中加載多次。
[需要的引證]爲「多次」部分。 – meriton 2011-12-23 20:31:24