?# 第四章第一節--反射
標簽(空格分隔): 廖雪峰
---
## class類
Java除了基本數據類型之外其他都是class(包括interface)
- String
- Object
- Runnable
- Execption
- ...
class/interface的數據類型是Class(注意這里區分大小寫)
每加載一個class,JVM就會為其創建一個Class類型的實例,并關聯起來.
當JVM加載String類的時候,先讀取String.class文件,再為String創建一個Class實例
`Class cls = new Class(String);(僅用來演示過程,Class為private,自己代碼是無法創建的)`
JVM持有的每一個Class實例都指向一個數據類型(class或者interface)

一個Class實例包含了該class的完整信息.

**所以說:**
1. JVM為每個加載的class創建對應的Class實例,并在實例中保存該class的所有信息.
2. 如果獲取了某個Class實例,則可以獲取到該實例對應的class的所有信息.
3. 通過Class實例獲取class信息的方法就叫做**反射**.
如何獲取一個class的Class實例呢?
1. Type.class `String.class`
2. getClass() `String s = "hello"; Class cls = s.getClass();`
3. Class.forName() `Class cls = Class.forName("java.lang.String");`

注意:
Class實例在JVM中是唯一的 可以用`==`比較兩個Class的實例.

- Class實例和instanceof的差別.(用的比較多)
- `==`只能做精確類型的對比,不能做子類的判斷.
- instanceof:不但匹配當前類型,還匹配當前類型的子類型.

## 反射
反射的目的:當獲取某個Object實例時,我們可以獲取該Object的class的所有信息.
從Class實例中獲取class信息:
- getName() 獲取類名
- getSimpleName() 獲取簡寫類型
- getPackage() 包名.

從Class實例判斷class的類型.
- isInterface() 是不是接口
- isEnum() 是不是枚舉類型.
- isArray() 是不是數據類型.
- isPrimitive() 是不是基本數據類型.

創建classs實例(自控制)
只能調用其public 沒有參數的構造方法.
- newInstance()

JVM的動態加載
利用其動態加載的特征可以在運行時候加載不同的實現類.

## 小節小結
- JVM為每一個加載的class創建對應的Class實例來保存class的所有信息.
- 獲取一個clas對應的Class之后,就可以獲取class的所有信息.
- 通過Class實例去獲取class信息的方法就叫做反色(Reflection)
- JVM總是動態加載class的,可以在運行的時候根據條件判斷加載class.
- 前言
- 一:Java快速入門
- 二:Java面向對象編程
- 三:Java異常處理
- 錯誤處理
- Java的異常
- 捕獲異常
- 拋出異常
- 自定義異常
- 斷言和日志
- 使用斷言
- 使用JDK Logging
- 使用Commons Logging
- 使用Log4j
- 四:Java反射與泛型
- 反射
- Class類
- 訪問字段
- 調用方法
- 調用構造方法
- 獲取繼承關系
- 注解
- 使用注解
- 定義注解
- 處理注解
- 泛型
- 什么是泛型
- 使用泛型
- 編寫泛型
- 擦拭法
- extends通配符
- super通配符
- 泛型和反射
- 五:Java集合
- Java集合簡介
- Java集合簡介
- List
- 使用List
- 編寫equals方法
- Map
- Set
- Queue
- Stack
- 最佳實踐
- 六:Java IO編程
- 七:Java處理日期和時間
- 八:JUnit單元測試
- 九:Java正則表達式
- 十:Java加密與安全
- 十一:Java多線程編程
- 十二:Maven基礎
- 十三:Java網絡編程
- 十四:Java操作XML和JSON
- 十五:Java JDBC編程
- 十六:Java函數式編程