注解和反射学习笔记
1.1 介绍
-
作用:对程序做出解释,可被其他程序读取,如编译器等;有检查和约束功能;
-
格式:“ @注释名(参数值) ”;
-
使用场景:package,class,method,field;通过反射机制实现对元数据的访问;
1.2 内置注解
-
@Override:只适用于修辞方法(method),表示一个方法声明重写超类中的另一个方法声明;定义在java.lang下;
-
@Deprecated:表示不鼓励使用,适用于修辞方法、属性、类,代码上会出现删除线效果;
-
@SuppressWarnings:用于抑制编译时的警告信息,如定义变量后未使用有警告,使用后警告消失;有参数,直接使用即可;
1.3 元注解 meta-annotation
-
作用:注解其他注解,对其他注解进行说明,多用在写自定义注解时;
-
具体:
key: 查看源代码确认作用域.
-
@Target:用于描述注解的使用范围,如类、方法或构造器上;
-
@Retntion:用于描述注解的生命周期,在什么级别还有效,RUNTIME(运行时有用) > CLASS(成为类时有用) > SOURCE(源代码中有用),一般都是RUNTIME;一般是固定形式:
![image-20210710115305064]()
-
@Documented:是否将我们的注解生成在JAVAdoc中;
-
@ Inherited:表示子类可以继承父类的注解,注意只对类有用,其他类型不会继承;
-
1.4 自定义注解
-
形式:(一般固定形式)
//写自定义注解时,加一些元注解 @Target({ElemenType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @interface MyAnnotation{ String name(); }![image-20210710115619771]()
-
具体:
key: 注解的参数不是方法.
-
参数可以设置默认值:
![image-20210710115910415]()
-
注解可以显式赋值,若无默认值则必须赋值:上面是自定义注解的使用,使用时参数赋值可以不按顺序,下面是注解的具体内容:
![]()
-
若只有一个值,一般用value命名,使用时可直接赋值,不用写参数名(只在参数名为value是省略);
-
2 反射 Reflection
2.1 概述
-
静态与动态:
-
动态:可以在运行时根据某些条件改变代码结构;
-
静态:运行时结构不变’
-
-
反射:允许程序在执行时借助Reflection API取得任何类的内部信息,并可以直接操作任意对象的内部属性和方法;
-
方法:getClass()方法;
2.2 获取反射
-
Class类:管理反射的核心类,Class本身是类,Class对象只能由系统创建,类加载加载之后,会有一个Class类型的对象,一个类只有一个Class对象,这个对象有这个类完整的结构信息,因此可以透过对象看类:
![]()
-
特点:灵活但是影响性能;
-
实例:
-
在类的主方法中使用:(注意大写)
![image-20210712101114635]()
这个Class类有很多方法; -
底层逻辑:每个程序唯一的class是Object的扩展对象,Object对象中定义了Class类的getClass方法,而Class是所有类的源头,所以才可以建Class类来获得当前类的完整信息,即通过对象来获取类的信息:
![image-20210712101759520]()
-
-
获取Class类的方法:
key: 对于每个类,JRE都为其保留一个不变的Class类型的对象,一个Class对象包含了某个特定结构的相关信息.
-
Class类的常用方法:、
![image-20210712161927702]()
-
获取方法
![image-20210712162414947]()
-
实例:下图利用上图的类进行演示,这里面删除了一些泛型
![image-20210712164012741]()
![image-20210712163940817]()
结果:
![image-20210712164241516]()
-
2.3 不同类型的Class对象
-
实例:
key: 只要元素类型和维度一样,就是同一个Class,如一维数组长度不同也是同一个类.
![image-20210712171904957]()
输出:
![image-20210712171933819]()
-
内存中的类:
key: 加载、链接与初始化.
-
加载:将class文件的字节码加载到内存,静态转动态,生成代表这个类的Class对象,因此每次都是获取而不能自己创建;
-
链接:将二进制代码合并进JVM的运行状态中,需要验证、准备(为static修饰的分配内存、设置变量初始值,都在方法区中)和解析过程(符号引用替换为直接引用);
-
初始化:JVM执行类构造器(构造类的信息);初始化时若子类的父类没初始化,先初始化父类;保证正确;
-
2.4 通过反射获取注解
-
ORM:对象关系映射(Object Relation Mapped),类与表、属性与字段、对象和记录;
-
用法:通过反射机制来获得自定义注解的内部信息;
-
实例:上图为使用注解,下图为自定义注解内容
![image-20210712182838529]()
![image-20210712183135303]()















浙公网安备 33010602011771号