Я получил два примера:Когда класс загружен в JVM
Пример 1:
public class A {
}
public class B {
public void m(A a) {
}
}
public class C {
public static void main(String[] args) {
B b = new B();
System.out.println("hello!");
}
}
компилировать все три класса. Удалите A.class. Запустите main. Никакое исключение не выбрасывается.
Пример 2:
public class D {
}
public class E {
public void omg(D d) {
}
public static void main(String[] args) {
E e = new E();
}
}
Обобщение классов. Удалите D.class. Выполнить основной метод.
Exception in thread "main" java.lang.NoClassDefFoundError: D
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Unknown Source)
at java.lang.Class.getMethod0(Unknown Source)
at java.lang.Class.getMethod(Unknown Source)
at sun.launcher.LauncherHelper.getMainMethod(Unknown Source)
at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)
Caused by: java.lang.ClassNotFoundException: D
at java.net.URLClassLoader$1.run(Unknown Source)
Почему? D никогда не упоминается.
Отличный вопрос!Думаю, что смотреть на выход «javap» было бы хорошим началом, чтобы узнать, что на самом деле выполняется, чтобы убедиться, что компилятор не оптимизировал некоторые вызовы. Это, вероятно, содержит ответ: http://docs.oracle.com/javase/specs/jls/se7/html/jls-12.html#jls-12.2 –
Класс не используется, но на него ссылаются. Вы используете его как аргумент метода. Класс сканируется для всех типов, которые ему нужны (в основном, для всего импорта), и они будут загружены в загрузчик классов. Вы можете видеть, когда классы загружаются, запустив JVM с параметром '-verbose: class'. –
@ M.Deinum и в первом примере? – user1745356