JavaSE---反射

前言: 反射就像是一面镜子,这面镜子其实就是JVM,他能照出你的类的所有属性和方法,也能调用你所有对象的属性和方法,crazy~

反射是什么?

  • 先说是怎么一回事。我要使用某个类,我必须要知道它是什么类,有何作用?用的时候,要先实例化。
//实例化一个对象,实例化的过程牵扯太多,不赘述
Student stu = new Studnt();
Class c1 = stu.getClass();
System.out.println(c1.getName());
  • 上面这个Student类,JVM在加载的时候这个类的时候,其实会在JAVA堆中创建一个java.lang.class类的对象,就是上面的c1,这个class对象代表类的相关信息。可以使用这个对象的一些方法来获取类的相关信息,这里也体现出了万物皆对象的理念,连类都是对象。
  • 看看class类,这还只是一小部分方法,跟类相关的都可以在Class类中找到。
    在这里插入图片描述
  • 那说了这么多,反射到底是什么呢?
    我的理解:在运行状态中,可以知道任意一个类的属性和方法,也可以调用任意一个对象的属性和方法,也就是动态获取信息,动态获取对象方法和属性,然而这些底层的实现细节都被屏蔽了,只留下API库给我们使用,也就是java.lang.reflect类库,这些API学习并不难,难在理解反射这个概念,由于实现细节都被屏蔽了,我们也就很少写到反射的代码。

反射有什么意义?

我直接new出来一个对象不就可以了,为什么用反射,要兜个大圈子?其实出去这些浅显表面的,反射真正的意义在于提高程序的灵活性,屏蔽底层实现细节,便于使用。

反射如何使用?

这个在使用的时候直接查API即可,常用的有以下几种。

  • 通过一个对象获得完整的包名和类名。
  • 实例化Class对象。
  • 获取一个对象的父类与实现的接口。
  • 获取某个类的全部构造函数。
  • 通过反射机制实例化一个对象。
  • 获取某个类的全部属性
  • 获取某个类的全部方法

反射的应用场景

  • JDBC(连接数据库与后端的桥梁),这其中就牵扯到一个连接的问题,我们将数据库的连接信息(用户名,用户密码,库名…)写在配置文件里,而不是写在代码里,为什么?因为这样我们更换数据库的时候,只需要改配置信息,而不是去改代码。而这里的由配置文件到代码,就是由反射来加载驱动的。
  • Spring MVC,学servlet的时候各种getParameter()获取信息,但是在SpringMVC框架中只需要在javaBean中约定好字段名,就可以把值填充进去。这就是反射的好处。
  • Spring,这个我学的还不多,但是涉及到一个自动组装的问题,只要字段名的顺序是约定一致的,就可使实现自动组装的效果,就像一个萝卜一个坑一样。如果顺序颠倒,可能在你想象中组装出来的是超跑,但是现实却是拖拉机。
  • Java的反射用的最多的地方就是在框架里面。比如说有两个程序员,他们各自创建了两个类,第一个程序员现在需要第二个程序员创建的类,可是现在第二个程序员创建的类还没有完成。那么第一个程序员编译自然不成功,但是现在第一个程序员又要使用第二个程序员的类,这个时候,反射就可以完成这个任务。因为反射是在类运行的时候获取对象的各个信息,所以第一个程序员的类就可以完成编译了。
发布了122 篇原创文章 · 获赞 59 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_44861399/article/details/105602588