反射的使用

基本原理:
反射可操作该类的所有东西,包括操作属性,方法,构造方法等等

1.获取Class对象(可能还有其它方法):
1.1:getClass()
图1
反射的使用

图2
反射的使用

1.2:Class.forName()
图3
反射的使用
图4
反射的使用

注:获取的是类,不是实例

2.关于getDeclaredXXX() 和getXXX()
图5
反射的使用

2.1:这里只讲解使用,不讲原理
getDeclaredXXX : 可获取所有字段,包括私有、受保护、默认的
getXXX: 获取共有字段(public)

2.1.1:参数说明
nameField.get(Object obj) : 参数 Object 传的是实例
例如 User user = new User() ,nameField.get(user )

图5.1
![这里写图片描述](https://img-blog.****.net/20180505170644328?watermark/2/text/aHR02.1.1:参数说明
nameField.get(Object obj) : 参数 Object 传的是实例, 例如 User user = new User() ,nameField.get(user ) cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE4NTgxNjUx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
图5.2
反射的使用

2.2:经常使用的几个方法讲解
Field : 字段的意思
图6
反射的使用

Method : 方法的意思
图7
反射的使用

Constructors : 构造方法
图8
反射的使用

3.创建实例
图9
反射的使用

4.作用、特性、使用场景:
网上找到了一些资料加上自己的一些总结,资料只是一些文字描述,我加上代码案例,让读者更加易于理解,通过此案例更加熟悉反射的使用

4.1:在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;
这个很好理解,通过 bClass.getFields()获取所有属性,通过getMethods()获取所有方法等

4.2:你用new的方法创建对象,这个程序就写死了,以后要改非常麻烦,可以动态获取的信息以及动态调用对象的方法的,将来你换别的类,程序不用改,照样能执行

打个比方:工厂模式(图10);不用反射新建实例的话,用new 的话(图11)
图10
反射的使用
图11
反射的使用
假如有一百几十水果,可想想象了。
4.2.1: 需求再来新增水果,那么需求再来还得继续新增,所以扩展非常麻烦
图12
反射的使用

4.3:你new对象,只能针对你知道的,现有的,反射能够考虑到未来的情况
比如上面的工作模式就能考虑到未来

4.4:某个类满足不了需求,比如jdk或者Android上的某些类,要更改某属性的值,该属性为private,不提供任何更改方法,那么只能用反射更改它的属性
图13
反射的使用
例子:该方法不提供任何修改该属性的值,但是需求要将其修改为 “萌妹子”
通过反射:
图14
反射的使用
图15
反射的使用
修改成功

5.Field实例几个常用方法讲解:
nameField. set(Object obj, Object value):
setInt(Object obj, int i):
nameField.setBoolean(Object obj, boolean z):

还有许多这些方法,set开头就是设置属性,通过方法名即可知道是干什么用的,下面讲一下参数的作用
参数1:Object 这个是实例,修改的对象的实例 User user = new User() , 要通过反射修改 user 实例的值,那么第一个参数就是填写 user,例如 nameField.setInt(user, 值)
参数2: 就是值,例如设值user 实例的nameField为“”萌妹子,那么: nameField.set(user, “萌妹子”);

6.setAccessible()方法讲解
6.1:这是设置访问权限,比如一些属性是private值,是不可访问的,访问会报 “图16” 错误,加上setAccessible(ture)就可以访问了,可看图14

6.2:注意:假如属性为public,那么设置nameField.setAccessible(false);也是可以访问的

图16
反射的使用