一、引言
在日常的工作中,如果是做业务开发,反射机制这个知识点很少有机会用到,当然也就不会放在心上,但如果想去看一些框架的源码或者深入一点学习,如果对Java反射机制不是很了解,那就会一头雾水。
最近又想去再看一下Spring的源码,想起自己第一次看Spring源码时的那种痛苦,我觉得很有必要还是先学习一下反射。希望对你有所帮助~~
恩,书读百遍其义自见。
二、反射基础介绍
1、反射的原理
Java反射机制就是程序在运行状态中,对于任意一个类,都能知道这个类的所有属性和方法,对于任意一个对象,都能调用它的任意方法和属性,这种动态获取信息以及动态调用对象的功能称为Java语言的反射机制。
粗略的理解:反射就是在程序运行时,能够动态的操作类的成员。
2、反射的相关类
| 类名 | 用途 |
|---|---|
| Class类 | 代表类和接口 |
| Field类 | 代表类的属性 |
| Method类 | 代表类的方法 |
| Constructor类 | 代表类的构造方法 |
3、Class类
Class类是描述类的类。能理解吗?
(1)、Class这个类中提供类很多的方法。
| 方法 | 用途 |
|---|---|
| getClassLoader() | 获得类的加载器 |
| getClasses() | 返回一个数组,数组中包含该类中所有公共(public)类和接口类的对象 |
| getDeclaredClasses() | 返回一个数组,数组中包含该类中所有(public、private、default)类和接口类的对象 |
| forName(String className) | 根据类名(包含包名)返回类的对象 |
| getName() | 获得类的完整路径名字(包含包名) |
| newInstance() | 创建类的实例 |
| getPackage() | 获得类的包 |
| getSimpleName() | 获得类的名字 |
| getSuperclass() | 获得当前类继承的父类的名字 |
| getInterfaces() | 获得当前类实现的类或是接口 |
| asSubclass(Class clazz) | 把传递的类的对象转换成代表其子类的对象 |
| Cast | 把对象转换成代表类或是接口的对象 |
(2)、获取类中属性相关的方法
| 方法 | 用途 |
|---|---|
| getField(String name) | 获得某个公有(public)属性对象 |
| getFields() | 获得所有公有(public)属性对象 |
| getDeclaredField(String name) | 获得某个属性(public、private、default)对象 |
| getDeclaredFields() | 获得所有属性(public、private、default)对象 |
(3)、获取类中注解的相关方法
| 方法 | 用途 |
|---|---|
| getAnnotation(Class annotationClass) | 返回该类中与参数类型匹配的公有(public)注解对象 |
| getAnnotations() | 返回该类所有的公有(public)注解对象 |
| getDeclaredAnnotation(Class annotationClass) | 返回该类中与参数类型匹配的所有(public、private、default)注解对象 |
| getDeclaredAnnotations() | 返回该类所有(public、private、default)的注解对象 |
(4)、获取类中构造器相关的方法
| 方法 | 用途 |
|---|---|
| getConstructor(Class parameterTypes) | 获得该类中与参数类型匹配的公有(public)构造方法 |
| getConstructors() | 获得该类的所有公有(public)构造方法 |
| getDeclaredConstructor(Class parameterTypes) | 获得该类中与参数类型匹配的构造方法,包含私有 |
| getDeclaredConstructors() | 获得该类所有(public、private、default)构造方法 |
(5)、获取类中方法的相关方法
| 方法 | 用途 |
|---|---|
| getMethod(String name, Class parameterTypes) | 获得该类某个公有(public)的方法 |
| getMethods() | 获得该类所有公有(public)的方法 |
| getDeclaredMethod(String name, Class parameterTypes) | 获得该类某个方法(public、private、default) |
| getDeclaredMethods() | 获得该类所有方法(public、private、default) |
(6)、类中其他重要的方法
| 方法 | 用途 |
|---|---|
| isAnnotation() | 如果是注解类型则返回true |
| isAnnotationPresent(Class
关注
打赏
立即登录/注册
微信扫码登录 |
