Java中的高级技术——反射

365 阅读3分钟

认识反射、获取类

反射就是:加载类,并允许以编程的方式解剖类中的各种成分(成员变量、方法、构造器等)。

典型的反射就是我们在新new了一个对象后,用对象去 . idea就会跳出很多提示(类中有的变量和方法),这就是因为idea用的反射去解剖这个对象所属类的所有信息

反射具体学什么?

学习获取类的信息操作他们。

万物皆对象,类本身也是对象

反射第一步:先获取Class对象!

有三种方式:

获取类中的成分、并对其进行操作(这段很干!)

先是获取:

再是操作:

我们获取了构造器之后,依旧是为了去创建对象,但就有疑问了,怎么创建对象我还需要用反射先拿到构造器然后再去创建对象?(有点脱裤子放屁,直接一new不就完了吗),你不管就是有用。

比如你看第3点的那个con是代表的右边被挡住的Dog无参构造

我们来用它来创建一个对象" Dog d1 = (Dog) con.newInstance( ); " ,会发现要报错

这是因为无参构造器的权限是私有的,私有的在外面是用不了的。那怎么办?注意!关键点来了,这里可以用到暴力反射, 强行攻破私有的构造器、方法和属性,在创建对象前面加一句:
con.setAccessible(true); 这就把访问权限改成了true,相当于绕过访问权限 直接访问,但不会将原本的无参方法改为公有的,只是临时用一下,临时攻破权限;所以私有的构造器外面也是有办法访问的。具体还有什么用,后面才知道~

所以为啥叫反射,原来是我们主动去new对象 去找构造器,而现在反射就是构造器追着你跑,构造器说:“来,遛(new)我”。hahaha


先是获取:

再是操作:

我们获取了成员变量的目的依旧是去取值和赋值


先是获取:

再是操作:

依旧是为了调用和执行

回答:

1. 我们都是调的getDeclared系列的方法去获取 所有的或者单个的 构造器、成员变量、方法。

比如 拿构造器要根据参数类型来匹配某个有参或者无参构造器:

//拿多个构造器

拿成员变量要根据成员变量名称来定位单个成员变量:

//拿多个成员变量

//拿单个成员变量

//拿单个成员变量

拿方法要根据方法名和后面的参数来匹配某个方法:(因为方法存在重载)

3. 去调他们的setAccessible方法 访问他的权限

反射的作用

泛型是再编译阶段对集合类型有约束,编译阶段结束后,会进行泛型擦除,所以在 运行阶段就没有了约束,如上就可以添加非string的数据进去,也就是利用反射在运行时进行的特点进行“翻墙”,绕过泛型的约束。

举例:使用反射做一个简易版的框架

需求:

对于任意一个对象,该框架都可以把对象的字段名和对应的值,保存到文件中去。

实现:

这里用了Print输出流,而且要用低级管道。

加上这句。就得到了: