Java的类与Class
-
RTTI(Run-Time Type Identification )运行时类型识另
-
—个Class对象就是一个类的说明书
- JVM根据这个说明书创建出来一个类的实例
- 现在你知道静态变量的本质是什么了么?
- Class对象的属性,归属Class对象
- 全局变量,类的所有实例共享同一个static变量
-
复习
-
- instanceof 左边的对象判断它右边的类型一不一样
- 对象通过getClsss方法拿到Class对象
-
强制类型转换
- 每个对象知道自己是从什么对象创建出来的
- JVM知道对象是什么类型的,一个猫不能转为Integer类型,所以丢一个ClassCastException异常
java.lang.OutOfMemoryError: PermGen 大概率是类出了问题
Class对象的生命周期
- 在第一次被使用时被加载
- 说明书从哪里来
- .java文件对应的.class文件加载出来的
graph BT
WhiteCat --extends--> Cat --extends--> Animal
根据白猫的说明书捏一个白猫,要先猫的说明书,要猫的说明书首先得有动物的说明书
有动物的说明书把动物造出来,然后用猫的说明书把猫造出来,然后再用白猫的说明书把白猫造出来
类加载的过程
graph LR
加载Loading--> 验证Verification --> 准备Preparation --> 解析Resolution --> 初始化Initialization
Clas s与C lassloader
- Classloader负责从外部系统中加载一个类
- 这个类对应的Java文件并不一定需要存在
- 这个字节码并不一定需要存在
- 这是Java世界丰富多彩的应用的基石
- Classloader的双亲委派加载模型
- Classloader类loadClass方法
- 任何一个类加载器被要求加载类的时候,它都会问自己的父亲,父亲给它的话就直接返回就不会自己尝试加载
- Java语言规范与Java虚拟机规范
- Java Language Specification JLS
- Java Virtual Machine Specification JVMS
- 这种分离提供了在JVM上运行其他语言的可能
反射
- 名字的由来一一为什么叫反射?
- JVM中一个对象通过镜子看到自己有什么东西,通过动态的方法调用它
- 假如说,我们想:
- 根据参数动态创建一个对象?
- 根据参数动态调用一个方法?
- 根据参数动态获取一个属性?
- Class
- Class.forNameO
Class.newInstancejdk9之后废弃- Class.getConstructor.newInstance
- Method
- Method.invoke
- Field
- Field.get
反射无处不在
- Spring源码分析
要对Object所有的方法都很熟悉
练习
「资料来源:饥人谷」