Java 中的反射与注解

date
Dec 2, 2021
slug
java-reflection-annotation
status
Published
tags
Java
summary
Java 中反射和注解的原理
type
Post

一、反射 Reflection 和 元类 Class

Class 元类是对普通类的抽象,是类的类。Class 包含了一个类的所有属性,包括类名、包名、父类、实现的接口、所有方法、属性等。拿到一个类的 Class 元类,就拿到了这个类所有信息,就可以通过这些信息动态做一些处理。
通过一个类的 Class 实例获取类信息的方法就称为反射(Reflection)
 
获取类的 Class 元类对象
方法一:直接通过静态变量class获取:
方法二:如果我们有一个实例变量,可以通过该实例变量提供的getClass()方法获取:
方法三:如果知道一个类的完整类名,可以通过静态方法Class.forName()获取:
 
操作 Field 和 Method
拿到了类的 Class 元类实例就是调用如下方法获取类的属性和方法等。
 
操作类的属性,实现动态改变类
得到 Field 对象或 Method 对象后,get set 值时都需要指定一个该类的实例,也就是 get set 针对哪个对象操作。
 
通过 Class 生成类实例
方式一:Class 对象的 newInstance 方法
调用Class.newInstance()的局限是,它只能调用该类的public无参数构造方法。如果构造方法带有参数,或者不是public,就无法直接通过Class.newInstance()来调用。
方式二:反射获取 Constructor 对象
 

二、注解的使用

注解分为定义注解,使用注解,解析注解。
注解有点像 Interface,但区别是注解中定义的方法,在使用时是通过属性赋值来使用的。
 
元注解
元注解就是给注解用的注解,常用的是 @Target 和 @Retention
Target 声明本注解可用在什么位置,如 ElementType.TYPE, ElementType.FIELD, ElementType.METHOD
Retention 表明本注解保留到什么时候,分为 RetentionPolicy.RUNTIME RetentionPolicy.SOURCE RetentionPolicy.CLASS
如果需要再运行时动态处理的注解,没有声明为 RUNTIME,则再运行时中就反射不到注解了。
 
解析注解
解析注解就是通过反射 Reflection 获取到一个类的全部信息,包括类上面的注解,再根据注解和其中的属性值进一步做响应的处理。
 

注解完整三步

定义注解:
 
Demo 实体类,使用注解
 
解析注解:
 
 
 
参考:

© 菜皮 2020 - 2024