寄蜉蝣于天地,渺沧海之一粟
反射就是把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. 总结
本次总结了注解和反射的基础,里面如果有错误或者建议,欢迎评论区指出。