欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JavaSE---反射

程序员文章站 2024-02-26 18:10:52
...

前言: 反射就像是一面镜子,这面镜子其实就是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类中找到。
    JavaSE---反射
  • 那说了这么多,反射到底是什么呢?
    我的理解:在运行状态中,可以知道任意一个类的属性和方法,也可以调用任意一个对象的属性和方法,也就是动态获取信息,动态获取对象方法和属性,然而这些底层的实现细节都被屏蔽了,只留下API库给我们使用,也就是java.lang.reflect类库,这些API学习并不难,难在理解反射这个概念,由于实现细节都被屏蔽了,我们也就很少写到反射的代码。

反射有什么意义?

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

反射如何使用?

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

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

反射的应用场景

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