Java反射
一.类的加载
1 类的加载概述
当我们的程序在运行后,第一次使用某个类的时候,会将此类的class文件读取到内存,并将此类的所有信息存储到一个Class对象中。
2 类的加载时机
- 创建类的实例。
- 类的静态变量,或者为静态变量赋值。
- 类的静态方法。
- 初始化某个类的子类。
- 直接使用java.exe命令来运行某个主类。
- 使用反射方式来强制创建某个类或接口对应的java.lang.Class对象。
3 类加载器
类加载器的作用:
- 加载器是Java运行时环境的一部分,负责加载字节码文件,即将磁盘上的某个class文件读取到内存并生成Class的对象
类加载器的分类:
- 启动类加载器(Bootstrap ClassLoader):负责加载JDK核心类库,核心类库位置\jdk\jre\lib\下的jar包。
注意:C++编写的加载器,获取启动类加载器后输出结果是null。
- 扩展类加载器(Extension ClassLoader):负责加载JDK扩展类库,类库位置\jdk\lib\ext\下的jar包。
- 应用程序类加载器(Application ClassLoader):负责加载我们自定义类的加载器。
当一个类的class文件被类加载器加载到内存后,类的加载器会创建出此class文件的对象。class文件的对象是Class类的对象,是反射技术的基石。
获取类加载器的方式:来自Class类型获取类加载器的方法
4 使用类加载器加载配置文件
- 在src下面新建一个db.properties文件
- 使用类加载器加载配置文件
二.反射
1 反射概述
- 反射在实际开发中的应用:
开发IDE(集成开发环境),通过反射技术对象类进行了解剖得到了类的所有成员。
各种框架的设计和学习 比如Spring,Hibernate,Struct,Mybaits....
- 反射的概念:
反射是一种机制,利用该机制可以在程序运行过程中对类进行解剖
并操作类中的所有成员(成员变量,成员方法,构造方法)
在运行时,可以直接得到这个类的构造器对象:Constructor
获取到构造器了,可以做什么? 创建对象
在运行时,可以直接得到这个类的成员变量对象:Field
获取成员方法了,可以做什么? 可以调用方法执行
在运行时,可以直接得到这个类的成员方法对象:Method
获取成员变量了,可以做什么? 赋值、取值
这种运行时动态获取类信息以及动态调用类中成分的能力称为
Java语言的反射机制
- 使用反射操作类成员的前提
要获得该类字节码文件对象,就是Class对象
利用Class对象,来获取到:构造器、成员方法、成员变量
2 Class对象的获取和常用方法
获取class对象方式 | 作用 | 应用场景 |
Class.forName("全类名") | 通过指定的字 符串路径获取 | 多用于配置文 件,将类名定义 在配置文件中。 读取文件,加载 类 |
类名.class | 通过类名的属 性class获取 | 多用于参数的传 递 |
对象.getClass() | 通过对象的 getClass()方法 获取 | 多用于对象的获 取字节码的方式 |
get set 方法省约
方法 | 说明 |
String getSimpleName() | 获得类名字符串:类名 |
String getName() | 获得类全名:包名+类名 |
T newInstance() | 创建Class对象关联类的对象 |
3 反射之操作构造方法
Constructor类概述
Constructor类:类中的每一个构造方法都是一个Constructor类的对象
反射之操作构造方法的目的:获得Constructor对象来创建类的对象。
通过反射获取类的构造方法
Class类中与Constructor相关的方法
1.Constructor[] getConstructors()
获得类中的所有构造方法对象,只能获得public的
2.Constructor[] getDeclaredConstructors()
获得类中的所有构造方法对象
可以是public、protected、(默认)、private修饰符的构造方法。
3.Constructor getConstructor(Class...parameterTypes)
* 根据参数类型获得对应的Constructor对象。
* 只能获得public修饰的构造方法
4.Constructor getDeclaredConstructor(Class...
parameterTypes)
* 根据参数类型获得对应的Constructor对象
* 可以是public、protected、(默认)、private修饰符的构造方法。
通过反射执行构造方法
Constructor对象常用方法
1. T newInstance(Object... initargs)根据指定的参数创建对象
2. void setAccessible(true)
设置"暴力反射"——是否取消权限检查,true取消权限检查,false表示不取消
get set 方法省约
4 反射之操作成员方法
1.Method类概述
Method类:每一个成员方法都是一个Method类的对象。反射之操作成员方法的目的:操作Method对象来调用成员方法。
2 通过反射获取类的成员方法
1.Method[] getMethods();
获得类中的所有成员方法对象,返回数组,只能获得public修饰的且包含父类的
2.Method[] getDeclaredMethods();
获得类中的所有成员方法对象,返回数组,只获得本类的,包括public、protected、(默认)、private的
3.Method getMethod(String name,Class...args);
根据方法名和参数类型获得对应的成员方法对象,只能获得public的
4.Method getDeclaredMethod(String name,Class...args);
根据方法名和参数类型获得对应的成员方法对象,包括public、protected、(默认)、private
3 通过反射执行成员方法
Method对象常用方法
Object invoke(Object obj, Object... args)
参数一:用obj对象调用该方法
参数二:调用方法的传递的参数(如果没有就不写)
返回值:方法的返回值(如果没有就不写)
void setAccessible(true)
设置"暴力访问"——是否取消权限检查,true取消权限检查,false表示不取消
5 反射之操作成员变量
1 Field类概述
Field类:每一个成员变量都是一个Field类的对象。
反射之操作成员变量的目的:通过Field对象给对应的成员变量赋值和取值
2 通过反射获取类的成员变量
Class类中与Field相关的方法
Field[] getFields();
获得所有的成员变量对应的Field对象,只能获得public的
Field[] getDeclaredFields();
获得所有的成员变量对应的Field对象,包括public、protected、(默认)、private的
Field getField(String name);
根据成员变量名获得对应Field对象,只能获得public修饰
Field getDeclaredField(String name);
根据成员变量名获得对应Field对象,包括public、protected、(默认)、private的
3 通过反射访问成员变量
void set(Object obj, Object value):赋值
参数1: 要赋值属性的对象
参数2: 属性具体的值
Object get(Object obj):取值
参数: 要获取属性值的对象
返回值: 属性具体的值
void setAccessible(true);暴力反射,设置为可以直接访问私有类型的属.
get set 省约
三.反射的应用
框架底层:反射+配置文件
- 在src下创建user.properti
className=com.lzw.demo05.UserServ
- UserService接口
- UserServiceImpl实现类
- 测试类
原文地址:https://blog.csdn.net/2401_86102746/article/details/143780813
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!