java.lang.ClassLoader
là một lớp học lớn như vậy. Sử dụng liên kết GrepCode của bạn (dành cho java 6-b14 phiên bản) bạn có thể tìm thấy tại dòng 267 phương thức công khai loadClass
.
Phương pháp này, gọi là bảo vệ loadClass
phương pháp tại dòng 308 và phương pháp này cố gắng tải một lớp được nạp previosly sử dụng:
findLoadedClass
mà trong đầu gọi các phương thức bản địa,
- Calling
parent.loadClass
,
findBootstrapClass0
(phương pháp gốc cũng) nếu không có parent
,
- Và cuối cùng là
findClass
nếu không tìm thấy lớp học nào.
Điều này rất quan trọng để nói, vì ClassLoader
cố gắng sử dụng lại các bản sao đã tải, hãy ghi nhớ.
Nhưng, ở đâu được gọi là defineClass
? Không có nơi nào từ lớp trừu tượng này, nhưng nếu bạn sử dụng công cụ tham khảo từ GrepCode và tìm kiếm nơi nó được sử dụng defineClass
(see here results), bạn sẽ tìm thấy rất nhiều lớp cụ thể mà cuối cùng gọi definClass
.
Không đơn giản, một số trong các lớp này ghi đè defineClass
trong khi các trường khác gọi số loadClass
của riêng chúng, sau đó gọi ... và cuối cùng, gọi số defineClass
.
Đừng quên rằng defineClass
của ClassLoader
kết thúc theo một trong ba phương pháp tự nhiên mà là trách nhiệm của JVM diệu: defineClass0
, defineClass1
và/hoặc defineClass2
Sửa
chức năng Native defineClass0
cuộc gọi Java_java_lang_ClassLoader_defineClass0
từ ClassLoader.c
và tương tự cho 1 và 2 chức năng.
Chức năng này tạo lớp bắt buộc sử dụng JVM_DefineClassWithSource
được xác định trong jvm.h
và được triển khai trong openjdk\hotspot\src\share\vm\prims\jvm.cpp
.
Tệp cuối cùng này xác định hàm jvm_define_class_common
mà cuối cùng là hàm tạo lớp bắt buộc. Cuối cùng, hàm này gọi JNIHandles::make_local
để cấp phát lớp. Bạn có thể xem mã của hàm cuối cùng này trong openjdk\hotspot\src\share\vm\runtime\jniHandles.cpp
Hy vọng nó sẽ trả lời câu hỏi của bạn.
Khi bạn đang giao dịch với JVM internals (magic!), Một nghi ngờ tốt là mọi thứ đang xảy ra trong mã gốc (C/C++/asm). – Nayuki
Chắc chắn nó có thể được, nhưng câu hỏi là: khi nào nó (Class đối tượng xuất hiện) xảy ra? Ngôn ngữ thực hiện không quan trọng –