关于java的反射机制--理论介绍
关于java的反射机制--理论介绍
-
使用目的:
通过外部文件配置,在不修改原码的情况下控制程序,此功能符合设计模式的ocp原则(开闭原则:不修改源码,扩容功能)
-
基本介绍:
反射机制允许程序在执行期借助ReflectionAPI取得任何类的内部信息(属性,构造器,方法……)并能操作对象的属性及方法,反射在设计模式和框架底层都可以用得到。
加载完类之后在堆中就会产生一个Class对象,这个对象包含了类的完整结构信息。
这个对象就像是一面镜子,透过此对象可以看到类的结构,故形象的称之为反射(看到一句有意思的话:反射这种机制与物理意义上的反射有着本质的不同,不应该称之为反射,应该叫反思。)
反射充分体现了java是面向对象语言的特征
反射中我们将一切都视为对象---->类,方法,属性都看作对象。这些对象也有着自己的方法。
反射是动态加载类的
动态加载(延时加载):运行时加载需要的类,如果运行时不需要该类则不进行加载,依赖性弱。
程序中使用了此类,但并没有创建此类,动态加载:在运行时若不需要此类则不会报错。
静态加载:编译时加载相关的类,若没有相关的类则会报错,依赖性强。
-
Class类
class类是反射中的一个核心类,该类表示的是类或接口的字节码对象。
注:此处的Class并不是我们传统意义上的Class类
解释:我们在写java代码时,会创建不同的类给其命名并new对象再调用其中的方法。比如说,我们创建一个Person类、User类、Son类,我们将其统称为类(Class),Person、User、Son便是这些类的类名,这里Class充当的角色就是User,Person,它只是一个类名,名称叫做Class.
-
计算机执行java程序:
计算机执行java程序分为三个阶段:编译阶段-->类加载阶段-->运行阶段
编译阶段:将我们java程序中的类编译为字节码文件,此字节码文件中包括这个类的属性、方法、构造器等一些信息
类加载阶段:通过类加载器将编译阶段生成的字节码文件,生成了一个Class对象并放在了堆中。
此阶段便体现了反射
运行阶段:
注:对象有一个特别重要的特性:能够记住它是属于哪个类的。
java反射机制在运行阶段可做的事:
- 判断一个对象所属的类,
- 构造任意一个类的对象
- 得到一个类所具有的成员变量和方法。
- 调用任意一个对象的成员变量和方法。
-
反射相关主要的类
java.long.class 反射的一个核心类
java.long.reflect.Method 方法类
java.long.reflact.Field 属性类
java.long.reflect.Constructor 构造器类
-
反射的优缺点
优点:可以动态的创建和使用对象(框架底层的核心),使用灵活,没有反射机制,框架技术将失去底层支撑。
缺点:使用反射机制是解释执行,对执行速度有影响。