为什么几乎所有的Java框架都要用到反射机制,她的魅力在哪里?

说起Java的反射机制,大家应该不陌生吧,她是Java语言多态的一种体现。但是在面试过程中,我发现很多人都只是停留在听说过的层面,并没有知其所以然,今天我们就来探讨下。

大部分人最早接触的反射代码,是JDBC的那一行Class.forName代码。为什么我们在实际的Java项目中很少用到反射,因为框架都帮我们做掉啦,像Spring、Mybatis、Druid等主流框架,无一离不开反射机制。

一、反射机制

Java反射机制是在运行状态中,对于任意一个类,都能够获取这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性。这种动态获取类信息以及动态调用对象内容就称为Java语言的反射机制。

简单的来说,反射机制指的是程序在运行时能够获取自身的信息。在Java中,只要给定类的名字, 那么就可以通过反射机制来获得类的所有信息。

二、反射的实现

要使用一个类,就要先把它加载到虚拟机中,生成一个Class对象。这个Class对象就保存了这个类的一切信息。反射机制的实现,就是获取这个Class对象,通过Class对象去访问类、对象的元数据以及运行时的数据。

1、获取Class对象的三种方式

使用 Class 类中的 forName()静态方法调用某个对象的 getClass()方法(需要new对象)调用某个类的 class 属性来获取该类对应的 Class 对象

2、创建Class对象的两种方法

Class 对象的 newInstance()。使用 Class 对象的 newInstance()方法来创建该 Class 对象对应类的实例,但是这种方法要求该 Class 对象对应的类有默认的空构造器。调用 Constructor 对象的 newInstance()。先使用 Class 对象获取指定的 Constructor 对象,再调用 Constructor 对象的 newInstance()方法来创建 Class 对象对应类的实例,通过这种方法可以选定构造方法创建实例。

三、关于反射机制的几点思考

Java中为什么要用反射机制?直接创建对象不就可以了吗,我觉得这主要涉及到了动态与静态的问题。

静态编译:在编译时确定类型,绑定对象,即通过。 动态编译:运行时确定类型,绑定对象。动态编译最大限度发挥了java的灵活性,体现了多 态的应用,有以降低类之间的耦合性。

从实际的编程使用来看,我对反射机制有几点思考,分享给大家。个人觉得,反射机制的优势很明显:她

可以实现动态创建对象和编译,体现出语言很大的灵活性,这也是反射被广泛用于各种框架中的最主要原因。

但是反射机制的缺点也是显而易见的:对性能有影响。使用反射基本上是一种解释操作,我们可以告诉JVM,我们希望做什么并且它满足我们的要求。这类操作总是慢于只直接执行相同的操作,同时在运行时动态编译也会比较消耗内存