寄蜉蝣于天地,渺沧海之一粟 
反射就是把java类中的各种成分映射成一个个的Java对象
1. 注解
可以被程序读取的注释
1.1 内置注解
- 栗子:
 
1  | package com.xxy.test;  | 
1.2 元注解(meta-annotation)
使用@interface自定义注解时,自动继承了java.lang.annotation接口,注解元素必须要有值
- 栗子:
 
1  | package com.xxy.test;  | 
1.3 反射操作注解
- 栗子
 - 自定义注解一
 
1  | package com.xxy.annotation;  | 
- 自定义注解二
 
1  | package com.xxy.annotation;  | 
- 反射操作注解
 
1  | package com.xxy.test;  | 
2. 反射机制
Class类是反射机制的根源,可以通过Object类中所提供的方法获取一个Class实例,
1  | graph LR  | 
- 动态语言
 
在运行时可以改变结构的语言,例如JavaScript,PHP,Python
- 静态语言
 
运行时不可以改变结构,例如Java【准动态语言,可以通过反射改变结构】,C,C++
3. Class类对象实例化
在运行期间,一个类,只有一个Class对象产生
通过Class.forName()方法【最常见】
通过Object的getClass()方法
通过“类.class”的形式
栗子
1  | package com.xxy.test;  | 
4. 对象实例化
创建一个类的实例时(new,反射,浅克隆,反序列化(深克隆))
4.1 创建运行时类的对象
- 栗子:
 
1  | package com.xxy.test;  | 
4.2 通过反射动态创建对象
- 栗子
 
1  | package com.xxy.test;  | 
4.3 性能问题
普通方法(new) > 设置可访问 > 不设置可访问
类.class > Class.forName(“”) > getClass()
4.4 反射获取泛型
- 栗子
 
1  | package com.xxy.test;  | 
5. ClassLoader类加载器
5.1 类的加载过程
1  | graph LR  | 
- 栗子
 
1  | package com.xxy.test;  | 
5.2 类初始化
- 类的主动引用
- 先初始化main()方法所在的类
 - new一个类的对象
 - 调用静态成员(除了final常量)和静态方法
 - 使用java.lang.reflect包的方法对类进行反射调用
 - 初始化一个类时,如果父类没有被初始化,则会先初始化父类
 
 - 类的被动引用
- 当访问一个静态域时,只有真正声明这个域的类才会被初始化
 - 通过数组定义类引用,不会触发此类的初始化
 - 引用常量不会触发此类的初始化(常量池)
 
 
5.3 类加载器的作用
- BootStrap【根加载器,系统类加载器】
 
由C++语言编写,主要目的是加载Java底层系统提供的核心类库
- ExtensionsClassloader【平台类加载器】
 
进行模块加载
- APPClassloader【应用程序类加载器】
 
加载CLASSPATH所指定的类文件或者JAR文件
自定义加载器【远程服务加载、数据库加载】
栗子
1  | package com.xxy.test;  | 
6. 总结
本次总结了注解和反射的基础,里面如果有错误或者建议,欢迎评论区指出。