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类中找到。
- 那说了这么多,反射到底是什么呢?
我的理解:在运行状态中,可以知道任意一个类的属性和方法,也可以调用任意一个对象的属性和方法,也就是动态获取信息,动态获取对象方法和属性,然而这些底层的实现细节都被屏蔽了,只留下API库给我们使用,也就是java.lang.reflect
类库,这些API学习并不难,难在理解反射这个概念,由于实现细节都被屏蔽了,我们也就很少写到反射的代码。
反射有什么意义?
我直接new
出来一个对象不就可以了,为什么用反射,要兜个大圈子?其实出去这些浅显表面的,反射真正的意义在于提高程序的灵活性,屏蔽底层实现细节,便于使用。
反射如何使用?
这个在使用的时候直接查API即可,常用的有以下几种。
- 通过一个对象获得完整的包名和类名。
- 实例化Class对象。
- 获取一个对象的父类与实现的接口。
- 获取某个类的全部构造函数。
- 通过反射机制实例化一个对象。
- 获取某个类的全部属性
- 获取某个类的全部方法
反射的应用场景
- JDBC(连接数据库与后端的桥梁),这其中就牵扯到一个连接的问题,我们将数据库的连接信息(用户名,用户密码,库名…)写在配置文件里,而不是写在代码里,为什么?因为这样我们更换数据库的时候,只需要改配置信息,而不是去改代码。而这里的由配置文件到代码,就是由反射来加载驱动的。
- Spring MVC,学
servlet
的时候各种getParameter()
获取信息,但是在SpringMVC框架中只需要在javaBean
中约定好字段名,就可以把值填充进去。这就是反射的好处。 - Spring,这个我学的还不多,但是涉及到一个自动组装的问题,只要字段名的顺序是约定一致的,就可使实现自动组装的效果,就像一个萝卜一个坑一样。如果顺序颠倒,可能在你想象中组装出来的是超跑,但是现实却是拖拉机。
- Java的反射用的最多的地方就是在框架里面。比如说有两个程序员,他们各自创建了两个类,第一个程序员现在需要第二个程序员创建的类,可是现在第二个程序员创建的类还没有完成。那么第一个程序员编译自然不成功,但是现在第一个程序员又要使用第二个程序员的类,这个时候,反射就可以完成这个任务。因为反射是在类运行的时候获取对象的各个信息,所以第一个程序员的类就可以完成编译了。
上一篇: asp.net中eval不能定义变量的问题的解决方法
下一篇: java连接mysql数据库的方法