-
目录
编辑反射可以将一个类中的(成员变量,成员方法和构造方法)全部提取出来
二、反射的用途1、获取一个类里面所有的信息,获取到了之后,再执行其他的业务; 2、逻辑结合配置文件,动态的创建对象并调用方法
反射的用途1:对于任意一个对象,都可以把对象的所有字段名和值,保存到文件中去
反射的用途2:反射可以跟配置文件结合的方式,动态的创建对象并调用方法
1.获取class对象(必需)——一般使用第一种方法( Class.forName(“全类名"); )
3.再次通过不同的方法获取其中的组成元素(修饰符,方法的参数,甚至方法的对象,等等...)
第一种方式(最为常用的) Class.forName(“全类名");
第二种方式(一般作为参数进行传递(作为多线程的锁)) 类名.class
第三种方式(当我们已经有了这个类的对象,才可以使用) 对象.getclass();
五、通过方法获取 构造方法、成员变量、成员方法带有 Declared 就是获取全部,包括私有化的
1. Constructor[]getDeclaredConstructors(); 返回所有构造方法对象的数组
2. Constructor getDeclaredConstructor (Class.. parameterTypes); 返回单个构造方法对象
1. Field[]getDeclaredFields(); 返回所有成员变量对象的数组
2. Field getDeclaredField(Stringname); 返回单个成员变量对象
3.进一步获取成员变量的全部(权限修饰符,变量名,数据类型,属性值)
1. Method[]getMethods(); 返回所有公共成员方法对象的数组,包括继承的
2. Method[] getDeclaredMethods(); 返回所有成员方法(包括私有的)对象的数组,不包括继承的
3. Method getMethod(String name, Class... parameterTypes); 返回单个公共成员方法对象
4. Method getDeclaredMethod(String name, Class.. parameterTypes); 返回单个成员方法对象
5.获取 成员方法 的 全部 (修饰符,抛出的异常,运行此方法)
-
一、反射的简单介绍—— 用来获取任意一个类中的所有信息
-
万物皆对象——将 类和其方法和变量 全部看做一个 对象
-
反射可以将一个类中的(成员变量,成员方法和构造方法)全部提取出来- 在IDEA中的使用——IDEA的自动提示功能
-
二、反射的用途
1、获取一个类里面所有的信息,获取到了之后,再执行其他的业务; 2、逻辑结合配置文件,动态的创建对象并调用方法-
反射的用途1:对于任意一个对象,都可以把对象的所有字段名和值,保存到文件中去
-
反射的用途2:反射可以跟配置文件结合的方式,动态的创建对象并调用方法
-
-
三、反射的一般使用过程:
-
1.获取class对象(必需)——一般使用第一种方法( Class.forName(“全类名"); )
-
2.通过多种方法获取不同的 构造方法、成员方法、成员变量。
-
3.再次通过不同的方法获取其中的组成元素(修饰符,方法的参数,甚至方法的对象,等等...)
-
-
四、获取class对象的三种方式
-
第一种方式(最为常用的) Class.forName(“全类名");
源代码阶段——A.java/A.class 参数:全类名: 包名 + 类名(也就是类的 复制引用) -
第二种方式(一般作为参数进行传递(作为多线程的锁)) 类名.class
加载阶段——A.class进入内存 -
第三种方式(当我们已经有了这个类的对象,才可以使用) 对象.getclass();
运行阶段——已经创建了 A的对象( A a = new A() )
-
-
五、通过方法获取 构造方法、成员变量、成员方法
带有 Declared 就是获取全部,包括私有化的-
获取构造方法、成员方法、成员变量使用到的变量
- get:获取 set:设置
- Constructor:构造方法 Method:成员方法 Field:成员变量
- Parameter:参数 Modifiers:修饰符 Declared:(包括)私有的
-
注意点: 暴力反射 + 修饰符
- 细节一:我们获取的所有方法和变量,如果是私有的,只是可以看到,还不能直接使用;如果需要使用,需要取消权限校验——也就是暴力反射 ——>调用 setAccessible(boolean flag); 方法,参数设置为 true
暴力反射:表示临时取消权限校验(暴力反射后,可以直接使用) - 细节二:获取修饰符返回的是 数字形式
2——>代表私有的 private
- 细节一:我们获取的所有方法和变量,如果是私有的,只是可以看到,还不能直接使用;如果需要使用,需要取消权限校验——也就是暴力反射 ——>调用 setAccessible(boolean flag); 方法,参数设置为 true
-
一、获取构造方法——Constructor
-
1. Constructor<?>[]getDeclaredConstructors(); 返回所有构造方法对象的数组
-
2. Constructor<T> getDeclaredConstructor (Class<?>.. parameterTypes); 返回单个构造方法对象
-
3.进一步获取构造方法的全部属性(修饰符,参数,属性值)
- 细节1:将修饰符 以对应的 数字形式 返回(2——>代表私有的 private)
作用:IDEA底层,根据权限修饰符返回的数字决定是否展示参数 - 细节2:获取属性值前需要先创建对象,(否则为空),使用创建对象方法时候,需要暴力反射,临时取消权限校验。
- 细节1:将修饰符 以对应的 数字形式 返回(2——>代表私有的 private)
-
4.Constructor类中用于创建对象的方法
- T newlnstance (0bject... initargs); 根据指定的构造方法创建对象
- setAccessible(boolean flag); 暴力反射——设置为true,表示取消访问检查
-
-
二、获取成员变量——Field
-
1. Field[]getDeclaredFields(); 返回所有成员变量对象的数组
-
2. Field getDeclaredField(Stringname); 返回单个成员变量对象
-
3.进一步获取成员变量的全部(权限修饰符,变量名,数据类型,属性值)
-
4.Field类中关于 成员变量属性值 的 获取/修改
细节1:同样,只是可以看到成员变量的全部内容,不是获取所有
细节2:想要使用成员变量,需要暴力反射- 1.先创建对象,可以先使用普通方法,也可以使用反射中的构造方法。
- 2.使用暴力反射,否则无法获取/赋值
- void set(Object obj, Object value); 赋值
- Object get(Object obj) 获取值。
-
-
三、 获取成员方法——Method
-
1. Method[]getMethods(); 返回所有公共成员方法对象的数组,包括继承的
-
2. Method[] getDeclaredMethods(); 返回所有成员方法(包括私有的)对象的数组,不包括继承的
-
3. Method getMethod(String name, Class<?>... parameterTypes); 返回单个公共成员方法对象
-
4. Method getDeclaredMethod(String name, Class<?>.. parameterTypes); 返回单个成员方法对象
注意:为了防止方法的重载造成错误,此处需要加上参数 -
5.获取 成员方法 的 全部 (修饰符,抛出的异常,运行此方法)
- Method类中 用于 运行方法——invoke()
- 1.创建 对象
- 2.暴力反射——取消权限校验
- 3.调用 运行方法 的方法
- Object invoke(Object obj, Object... args): 运行方法
参数一:用obj对象调用该方法 参数二:调用方法的传递的参数(如果没有就不写) 返回值:方法的返回值(如果没有就不写)
- Method类中 用于 运行方法——invoke()
-
-
-
今天认识到了什么叫 万物皆对象——反射
最新推荐文章于 2024-09-23 14:24:34 发布