image

反射

作用:在运行状态中,获取任意一个类的结构,从而创建对象,获取指定方法或属性,并执行方法.

这种在运行状态动态获取信息以及动态调用对象方法(动态加载机制)的功能被称为java的反射机制.

反封装


获取类结构Class

如果在编写代码时,知道类的名称,且类已经存在.

Class c = 包名.类名.class
或者
Class c = 对象.getClass()

或者,如果编写代码时,知道类的全限定名

Class.forName("包名+类名")
即动态编程

对于方式3,如果无法找到给定的全限定名对应的类,则会抛出ClassNotFoundException异常.

获取构造方法Constructor并创建对象

  1. 通过获取的Class对象
  2. 获取该对象的某个构造方法调用方法
getConstructor(参数列表)
或者
getDeclaredConstructor(参数列表)

从而获得指定参数列表的构造方法.

或者通过getConstructorsgetDeclaredConstructors获取所有构造方法.

其中getDeclaredConstructors可以获取私有权限的构造方法,从而做到反封装.但是需要通过setAccessible设置为true忽略访问检查.

获取构造方法之后,即可通newInstance方法创建对象.
除此之外,在获取Class对象之后,可以直接调用newInstance方法创建对象

获取成员方法Method

  1. 创建对象(过程略)
  2. 获取类的方法
  3. invoke执行该方法

获取类的方法

getMethod(方法名,参数列表)
或者
getMethods()

或者

getDeclaredMethod(方法名,参数列表)
或者
getDeclaredMethods()
(反封装)
setAccessible(true)`设置忽略访问检查

获取该类下的指定成员方法或者所用成员方法.

执行
通过方法invoke执行该方法,参数一为对象,后续参数为传递给目标方法的参数.

获取成员属性Field

  1. 获取成员属性的方式与获取成员方法的过程基本类似
  2. 调用方法获取属性
  3. 获取/设置属性值

获取属性

getField(属性名)
或者
getFields()

或者

getDeclaredField(属性名)
或者
getDeclaredField()
setAccessible(true)设置忽略访问检查

获取/设置属性值
获取指定名称的属性或者所有属性,然后调用其get/set方法以获取属性值或者设置属性值.

获取注解

  1. 获取类结构/方法/属性.
  2. 获取其上的注解.
  3. 获取注解的内容

获取注解

getAnnotations(注解类型.class)
或者
getAnnotations()

getDeclaredAnnotations(注解类型.class)
或者
getDeclaredAnnotations()
setAccessible(true)

调用对应的注解内的方法,获取注解内部的值


其他方法

001.png

004.png


Severus
10 声望0 粉丝