反射与注解
Annotation
作用:可以被其他程序(如编译器)读取
@SuppressWarnings(),镇压警告,含参(看源码)
自定义注解:
@Target(value={…}):表示注解用在哪些地方
@Retention(value={…}):表示注解在哪些地方有效(runtime>class>sources)
@Documented:表示是否将注解生成在javadoc中
@Inherited:表示子类可以继承注解
Reflection
优点:动态创建对象和编译,灵活
缺点:影响性能
主要API:java.lang.class
一个数据类型只有一个Class,任何类型都有class
例:JavaSE2021_study\注解与反射\src\com\qihang\Reflection\反射获得Class类.java
Java内存分析

类加载过程

1 | Load:如图 |
例:JavaSE2021_study\注解与反射\src\com\qihang\Reflection\Test02.java
什么时候发生类的初始化
1.类的主动引用(一定会发生类的初始化)
- 当虚拟机启动先初始化main所在的类
- new 一个类的对象
- 调用类的静态成员(除了final常量)和方法
- 使用java.lang.reflect包中的方法对类进行反射调用
- 当初始化一个类,如果父类没有被初始化,则先初始化它的父类
2.类的被动引用
- 当访问一个静态域时,只有真正声明这个域的类才会被初始化,如:当通过子类引用父类的静态常量,不会导致子类初始化
- 通过数组定义类引用,不会触发此类的初始化
- 引用常量不会触发此类的初始化(常量在链接阶段就存入调用类的常量池中了)
1 | Class c1=Class.forName("..."); |
动态创建对象(反射)
1 | Class c1=Class.forName("...User"); |
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.








