# 第四章第一节--反射
标签(空格分隔): 廖雪峰
---
## 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实例对比](http://p0b921qfc.bkt.clouddn.com/18-5-17/5715564.jpg)
一个Class实例包含了该class的完整信息.
![Class的完整信息](http://p0b921qfc.bkt.clouddn.com/18-5-17/47214925.jpg)
**所以说:**
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");`
![三种调用方式](http://p0b921qfc.bkt.clouddn.com/18-5-17/46471517.jpg)
注意:
Class实例在JVM中是唯一的 可以用`==`比较两个Class的实例.
![三种方式比较相同](http://p0b921qfc.bkt.clouddn.com/18-5-17/21165063.jpg)
- Class实例和instanceof的差别.(用的比较多)
- `==`只能做精确类型的对比,不能做子类的判断.
- instanceof:不但匹配当前类型,还匹配当前类型的子类型.
![对比结果](http://p0b921qfc.bkt.clouddn.com/18-5-17/12148084.jpg)
## 反射
反射的目的:当获取某个Object实例时,我们可以获取该Object的class的所有信息.
从Class实例中获取class信息:
- getName() 获取类名
- getSimpleName() 获取简写类型
- getPackage() 包名.
![Class中获取的基本信息](http://p0b921qfc.bkt.clouddn.com/18-5-17/83464025.jpg)
从Class实例判断class的类型.
- isInterface() 是不是接口
- isEnum() 是不是枚举类型.
- isArray() 是不是数据类型.
- isPrimitive() 是不是基本数据类型.
![判断信息](http://p0b921qfc.bkt.clouddn.com/18-5-17/46533131.jpg)
创建classs实例(自控制)
只能调用其public 没有参数的构造方法.
- newInstance()
![新建实例](http://p0b921qfc.bkt.clouddn.com/18-5-17/94670669.jpg)
JVM的动态加载
利用其动态加载的特征可以在运行时候加载不同的实现类.
![动态加载的时候判断](http://p0b921qfc.bkt.clouddn.com/18-5-17/95550557.jpg)
## 小节小结
- 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函数式编程