除了int
等基本類型外,Java的其他類型全部都是class
(包括interface
)。例如:
String
Object
Runnable
Exception
- ...
class
是由JVM在執行過程中動態加載的。JVM在第一次讀取到一種class
類型時,將其加載進內存。
每加載一種class
,JVM就爲其創建一個Class
類型的實例,並關聯起來。注意:這裏的Class
類型是一個名叫Class
的class
。它長這樣:
public final class Class {
private Class() {}
}
以String
類爲例,當JVM加載String
類時,它首先讀取String.class
文件到內存,然後,爲String
類創建一個Class
實例並關聯起來:
Class cls = new Class(String);
一個Class
實例包含了該class
的所有完整信息:
┌───────────────────────────┐
│ Class Instance │──────> String
├───────────────────────────┤
│name = "java.lang.String" │
├───────────────────────────┤
│package = "java.lang" │
├───────────────────────────┤
│super = "java.lang.Object" │
├───────────────────────────┤
│interface = CharSequence...│
├───────────────────────────┤
│field = value[],hash,... │
├───────────────────────────┤
│method = indexOf()... │
└───────────────────────────┘
由於JVM爲每個加載的class
創建了對應的Class
實例,並在實例中保存了該class
的所有信息,
包括類名、包名、父類、實現的接口、所有方法、字段等,
因此,如果獲取了某個Class
實例,我們就可以通過這個Class
實例獲取到該實例對應的class
的所有信息。
這種通過
Class
實例獲取class
信息的方法稱爲反射(Reflection)。