文章目录
最爱百度百科+自我总结
🤍反射这一概念最早由编程开发人员Smith在1982年提出,主要指应用程序访问、检测、修改自身状态与行为的能力。
这一概念的提出立刻吸引了编程界的极大关注,各种研究工作随之展开,随之而来引发编程革命,出现了多种支持反射机制的面向对象语言。
🤍反射是在运行时,而非编译时,动态获取类型的信息,比如接口信息、成员信息、方法信息、构造方法等
🤍Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象
,可以了解任意一个对象所属的类
,可以了解任意一个类的成员变量和方法
,可以调用任意一个对象的属性和方法
。这种动态获取程序信息
以及动态调用对象的功能
称为Java语言的反射机制。反射被视为动态语言的关键。
💜💜💜💜💜
一般而言,开发者社群说到动态语言,大致认同的一个定义是:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。
从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。
尽管在这样的定义与分类下Java不是动态语言,它却有着一个非常突出的动态相关机制:Reflection。这个字的意思是“反射、映象、倒影”,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。
换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。
这种“看透class”的能力(the ability of the program to examine itself)被称为introspection(内省、内观、反省)。Reflection和introspection是常被并提的两个术语。
💛💛💛💛💛
反射机制
对于一个字节码文件.class,虽然表面上我们对该字节码文件一无所知,但该文件本身却记录了许多信息。Java在将.class字节码文件载入时,JVM将产生一个java.lang.Class对象代表该.class字节码文件,从该Class对象中可以获得类的许多基本信息
,这就是反射机制。
(产生了一个对象!)
🖤🖤🖤🖤🖤
反射机制所需的类主要有java.lang包中的Class类
和java.lang.reflect包中的Constructor类、Field类、Method类和Parameter类
。Class类是一个比较特殊的类,它是反射机制的基础
,Class类的对象表示正在运行的Java程序中的类或接口
,也就是任何一个类被加载时,即将类的.class文件(字节码文件)读入内存的同时,都自动
为之创建一个java.lang.Class对象。Class类没有公共构造方法
,其对象是JVM在加载类时通过调用类加载器中的defineClass()方法创建的
,因此不能显式地创建一个Class对象
。通过这个Class对象,才可以
获得该对象的其他信息。
在Java中,类信息对应的类就是java.lang.Class,反射的入口是名称为Class的类
反射机制中除了上面介绍的java.lang包中的Class类之外,还需要java.lang.reflect包中的Constructor类、Method类、Field类和Parameter类。
java.lang.reflect.Method类
是java.lang.reflect.Executable类的直接子类
,用于封装成员方法的信息,调用Class对象的getMethod()方法或getMethods()方法可以获得当前运行时类的指定方法或所有方法
。下表是java.lang.reflect.Method类的常用方法。
意义
首先,反射机制极大的提高了程序的灵活性和扩展性,降低模块的耦合性,提高自身的适应能力。
其次,通过反射机制可以让程序创建和控制任何类的对象,无需提前硬编码目标类。
再次,使用反射机制能够在运行时构造一个类的对象、判断一个类所具有的成员变量和方法、调用一个对象的方法。
最后,反射机制是构建框架技术的基础所在,使用反射可以避免将代码写死在框架中。