2011-12-23 13 views
7

Załóżmy, że mam klasę tylko statycznymi metodami. Czy moduł ładujący klasy ładuje każdą zaimportowaną klasę podczas ładowania klasy do pamięci? Lub będzie on ładował import tylko wtedy, gdy metoda z tego będzie potrzebować dostępu do niego?Kiedy klasaLoader ładuje import?

Pytanie brzmi, czy moduł ładujący klasy ładuje dane importowane, gdy klasa jest ładowana do pamięci lub tuż przed użyciem niektórych metod. Jeśli jest to pierwsza opcja, prawdopodobnie musiałbym podzielić niektóre z moich Util klas, aby być bardziej wyspecjalizowanych.

Odpowiedz

14

myślę, że można go przetestować w następujący sposób:

package pkg1; 

public class Test { 

    static { 
     System.out.println("Hello 111"); 
    } 

    public static void meth() { 
     System.out.println("Hello 222"); 
    } 
} 

Test 1:

package pkg2; 

import pkg1.Test; 

public class Tester {  

    public static void main(String... args) {     
     Test t;  
    }  
} 

która drukuje nic.

Test 2:

package pkg2; 

import pkg1.Test; 

public class Tester {  

    public static void main(String... args) {     
     Test.meth();   
    } 

} 

Wydruki:

 
Hello 111 
Hello 222 

Tak, tylko dlatego, że zostały przywiezione klasa nie oznacza classloader ładuje klasę do pamięci. Ładuje się dynamicznie, gdy jest używany.

2

Nie twierdzę, że wiem dużo na temat programu ładującego klasy, ale jeśli mówimy o instrukcjach importu, program ładujący klasy jest nieistotny.

Instrukcje importu istnieją wyłącznie w celu umożliwienia programistom używania krótkich nazw klas, a nie w pełni kwalifikowanych nazw każdej klasy, do której się odwołuje w zapisywanej klasie. Kompilator bardzo wcześnie używa tych instrukcji importu, aby rozwiązać nazwy przywoływanych klas przed utworzeniem pojedynczej linii kodu bajtowego.

1

Zasadniczo blok kodu statycznego u góry pliku klasy z raportem (np. Wyciągiem do wydruku) daje dobre pojęcie o tym, kiedy ładowanie odbywa się w konkretnej aplikacji.

Jednak w przypadku narożnych przypadków, takich jak klasy dynamiczne, wewnętrzne klasy statyczne lub klasy poza ścieżką klasy, które są dynamicznie ładowane, trzeba być ostrożnym - ponieważ te klasy mogą być faktycznie załadowane WIELE razy w aplikacji.

+0

[potrzebne źródło] dla części "wiele razy". – meriton

Powiązane problemy