反射
作用:在运行状态中,获取任意一个类的结构,从而创建对象,获取指定方法或属性,并执行方法.
这种在运行状态动态获取信息以及动态调用对象方法(动态加载机制)的功能被称为java的反射机制.
反封装
获取类结构Class
如果在编写代码时,知道类的名称,且类已经存在.
Class c = 包名.类名.class
或者
Class c = 对象.getClass()
或者,如果编写代码时,知道类的全限定名
Class.forName("包名+类名")
即动态编程
对于方式3,如果无法找到给定的全限定名对应的类,则会抛出ClassNotFoundException异常.
获取构造方法Constructor并创建对象
- 通过获取的Class对象
- 获取该对象的某个构造方法调用方法
getConstructor(参数列表)
或者
getDeclaredConstructor(参数列表)
从而获得指定参数列表的构造方法.
或者通过getConstructors和getDeclaredConstructors获取所有构造方法.
其中getDeclaredConstructors可以获取私有权限的构造方法,从而做到反封装.但是需要通过setAccessible设置为true忽略访问检查.
获取构造方法之后,即可通newInstance方法创建对象.
除此之外,在获取Class对象之后,可以直接调用newInstance方法创建对象
获取成员方法Method
- 创建对象(过程略)
- 获取类的方法
- invoke执行该方法
获取类的方法
getMethod(方法名,参数列表)
或者
getMethods()
或者
getDeclaredMethod(方法名,参数列表)
或者
getDeclaredMethods()
(反封装)
setAccessible(true)`设置忽略访问检查
获取该类下的指定成员方法或者所用成员方法.
执行
通过方法invoke执行该方法,参数一为对象,后续参数为传递给目标方法的参数.
获取成员属性Field
- 获取成员属性的方式与获取成员方法的过程基本类似
- 调用方法获取属性
- 获取/设置属性值
获取属性
getField(属性名)
或者
getFields()
或者
getDeclaredField(属性名)
或者
getDeclaredField()
setAccessible(true)设置忽略访问检查
获取/设置属性值
获取指定名称的属性或者所有属性,然后调用其get/set方法以获取属性值或者设置属性值.
获取注解
- 获取类结构/方法/属性.
- 获取其上的注解.
- 获取注解的内容
获取注解
getAnnotations(注解类型.class)
或者
getAnnotations()
和
getDeclaredAnnotations(注解类型.class)
或者
getDeclaredAnnotations()
setAccessible(true)
调用对应的注解内的方法,获取注解内部的值
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。