JAVA反射机制

论坛 期权论坛     
选择匿名的用户   2021-5-22 14:59   59   0
<p><span style="font-family:KaiTi_GB2312; font-size:24px">    反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。Reflection 是 Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说“自审”,并能直接操作程序的内部属性和方法。他主要依托JVM中关于类的元数据信息来完成这一功能,有过C&#43;&#43;编程经验的同学应该很了解C&#43;&#43;中实现多态的虚表吧,在这里的元数据其实和虚表类似,起码在理解反射的时候可以这么认为。</span></p>
<p><span style="font-family:KaiTi_GB2312; font-size:24px"> </span></p>
<p><span style="font-family:KaiTi_GB2312; font-size:24px">    Java的反射机制主要能实现一下功能:</span></p>
<p></p>
<ul><li><span style="font-family:KaiTi_GB2312; font-size:24px">在运行时判断任意一个对象所属的类</span></li><li><span style="font-family:KaiTi_GB2312; font-size:24px">在运行时构造一个类的对象</span></li><li><span style="font-family:KaiTi_GB2312; font-size:24px">在运行时判断任意一个类具有的成员变量和方法</span></li><li><span style="font-family:KaiTi_GB2312; font-size:24px">在运行时调用任意一个对象的方法</span></li></ul>
<p></p>
<p><span style="font-family:KaiTi_GB2312; font-size:24px">    <span style="color:#ff0000"> <strong>注意大前提,都是在运行时</strong></span>,通常的语言的运行时状态是不能修改的,而java的强大的反射机制,使得java程序员可以操作类的运行时状态和信息。</span></p>
<p><span style="font-family:KaiTi_GB2312; font-size:24px"><br> </span></p>
<p><span style="font-family:KaiTi_GB2312; font-size:24px">    Reflection 是 Java 被视为动态(或准动态)语言的关键,允许程序在执行期 Reflection 任何已知名称之 class 的內部信息,包括 package、type parameters、super class(父类)、implemented interfaces(实现的接口)、inner classes, outer class, fields(属性)、constructors(构造函数)、methods(方法)、modifiers(修饰符),并可于执行期生成instances、变更 fields 內容或调用 methods。<span style="color:#ff0000"><strong>换句话说,就是只要知道类的名字,程序员就可以知道类的所有信息,甚至在执行期生成instances、变更 fields 內容或调用 methods。</strong></span></span></p>
<p><span style="font-family:KaiTi_GB2312; font-size:24px"><span style="color:#ff0000"><strong><br> </strong></span>    何谓动态语言:程序在运行期间,允许改变程序的结构或变量类型,如python,在变量使用前不需要声明他的类型,运行时会根据内容自动改变他的类型,但是对于C/C&#43;&#43;来说,在变量使用前,必须首先声明他的类型。根据这种定义,java并不是动态语言,但是他却有着和动态语言相关的一个机制那就是反射。用在java身上就是指我们可以在运行期加载、探知和使用编译器完全未知的classes。换句话说,java可以加载一个运行时才得知名称的class,获悉其完整构造(但是不包括method的定义),并生成这种对象实例,或对其field设置或调用其method。</span></p>
<p><span style="font-family:KaiTi_GB2312; font-size:24px"> </span></p>
<p><span style="font-family:KaiTi_GB2312; font-size:24px">    实现java反射机制的相关的类:(以下解释主要来自jdk_api)<br>     Java的反射所需要的类并不多,它们分别是:Field、Constructor、Method、Class、Object,下面我将对这些类做一个简单的说明。<br> </span></p>
<ul><li><span style="font-family:KaiTi_GB2312; font-size:24px">Field类:提供有关类或接口的属性的信息,以及对它的动态访问权限。反射的字段可能是一个类(静态)属性或实例属性,简单的理解可以把它看成一个封装反射类的属性的类。</span></li><li><span style="font-family:KaiTi_GB2312; font-size:24px">Constructor类:提供关于类的单个构造方法的信息以及对它的访问权限。这个类和Field类不同,Field类封装了反射类的属性,而Constructor类则封装了反射类的构造方法。</span></li><li><span style="font-family:KaiTi_GB2312; font-size:24px">Method类:提供关于类或接口上单独某个方法的信息。所反映的方法可能是类方法或实例方法(包括抽象方法)。 这个类不难理解,它是用来封装反射类方法的一个类。</span></li><li><span style="font-family:KaiTi_GB2312; font-size:24px">Class类:类的实例表示正在运行的 Java 应用程序中的类和接口。枚举是一种类,注释是一种接口。每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。Class对象是java
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP