java.lang.ClassLoader
такой большой класс. Используя ссылку GrepCode (, которая предназначена для java 6-b14 версии), вы можете найти в строке 267 общедоступный метод loadClass
.
Этот метод, требует защищенного loadClass
метода в строке 308, и этот метод попытке загрузить previosly загруженный класс с помощью:
findLoadedClass
который в торцах называет собственные методы,
- Вызов
parent.loadClass
,
findBootstrapClass0
(родной метод также), если нет parent
,
- И, наконец,
findClass
, если класс не найден.
Это важно сказать, потому что ClassLoader
пытается повторно использовать уже загруженные клады, имейте в виду.
Но где defineClass
вызывается? Нет места из этого абстрактного класса, но если вы используете справочный инструмент из GrepCode и ищете, где он используется defineClass
(see here results), вы найдете много конкретных классов, которые в конце концов назовут definClass
.
Это не просто, некоторые из этих классов переопределяют defineClass
, а другие называют его loadClass
, который затем вызывает ... и так далее, но, наконец, он вызывает defineClass
.
Не забывайте, что defineClass
из ClassLoader
заканчивается в одном из трех нативных методов, которые отвечают на JVM волшебного: defineClass0
, defineClass1
и/или defineClass2
Edit
Native функции defineClass0
вызовов Java_java_lang_ClassLoader_defineClass0
из ClassLoader.c
и то же самое для 1 и 2 функций.
Эта функция создает необходимый класс, используя JVM_DefineClassWithSource
, определенный в jvm.h
и реализованный в openjdk\hotspot\src\share\vm\prims\jvm.cpp
.
Этот последний файл определяет функцию jvm_define_class_common
, которая в конце является функцией, которая создает необходимый класс. Наконец, эта функция вызывает JNIHandles::make_local
, чтобы выделить класс. Вы можете увидеть код этой последней функции в openjdk\hotspot\src\share\vm\runtime\jniHandles.cpp
Надеюсь, он ответит на ваш вопрос.
Когда вы имеете дело с внутренностями JVM (магия!), Хорошее подозрение в том, что все происходит в собственном коде (C/C++/asm). – Nayuki
Уверен, что это может быть, но вопрос: когда это происходит (объект класса)? Язык реализации не имеет значения. –