Jestem trochę zmieszany, gdy klasa faktycznie jest ładowana przez maszynę JVM. Zauważyłem, że program ładujący klasy załaduje klasę, gdy odwołanie się do klasy.Nieporozumienia związane z ładowaniem klasy
Używam środowiska java6 i uruchamiam z opcją -verbose: class, aby śledzić ładowanie klasy. Na przykład:
MyObject obj = new MyObject(); //MyObject.class will be loaded
Jednak w tym przypadku
// ClassC.java
package com.gogog22510.test;
public class ClassC {}
// ClassB.java
package com.gogog22510.test;
public class ClassB extends ClassC {}
// ClassA.java
package com.gogog22510.test;
public class ClassA {
public ClassC test() {
return new ClassB();
}
}
kiedy mój program testowy zainicjować ClassA, to załadowanie wszystkich ClassA, ClassB i ClassC choć nie powoływać test()
// TestClassLoad.java
package com.gogog22510.test;
public class TestClassLoad {
public static void main(String[] args) {
// initialize ClassA
System.out.println("start load ClassA");
new ClassA();
}
}
konsola:
[załadowany TestClassLoad z pliku: /.../ bin /]
obciążenia początek ClassA
[załadowany Classa z pliku:/C: /.../ bin /]
[załadowany ClassC z pliku:/C: /.../ bin /]
[Loaded ClassB z pliku:/C: /.../ bin /]
Ale jeśli zmienię test() metoda jest zwracany typ tak :
// ClassA.java
package com.gogog22510.test;
public class ClassA {
public ClassB test() {
return new ClassB();
}
}
ClassLoader załaduje ClassA tylko do przestrzeni perm, chyba że wywołam metodę test().
konsoli:
[załadowany TestClassLoad z pliku: /.../ bin /]
obciążenia początek ClassA
[załadowany Classa z pliku:/C: /.../ Pojemnik /]
Dlaczego obciążenie ClassLoader wszystkie trzy klasy przed jawnie wywołać metodę?
_it załaduje wszystkie klasy A, ClassB i ClassC_ Jak możesz powiedzieć? –
Nie mogę odtworzyć tego zachowania, tylko ładowana jest klasa Class http://ideone.com/Gw9QDU – Pshemo
Ten kod źródłowy nie jest wystarczająco kompletny, aby się odtworzyć. Jaka klasa jest główna (String []) w? Czy klasy wewnętrzne ClassA, ClassB i ClassC lub oddzielne pliki źródłowe? Co ma wspólnego z tym MyObject? Kiedy mówisz, że zostanie załadowany w podanym przykładzie? Przydałoby się precyzyjne odwzorowanie zachowania, które opisujesz (a jak wspomina @SotiriosDelimanolis, jak mierzysz zachowanie, które opisujesz). –