java概述 24 反射_第1页
java概述 24 反射_第2页
java概述 24 反射_第3页
java概述 24 反射_第4页
java概述 24 反射_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、类型信息与反射1.类型信息存储类型信息存储2.类型信息概述类型信息概述3类型信息的加载类型信息的加载4核心类介绍核心类介绍5Class类的获取方法类的获取方法6获取获取Construction方法方法7获取获取Method对象对象8获取获取Field对象对象9类型信息运用类型信息运用RTTI类型信息存储Java编译器编译器1class文件与文件与java文件文件类型信息概述.java文件中只含有一个类或接口只产生一个.class文件public class Person 字节码存放在Person.class文件中java类文件中存在内部类产生多个.class文件public class Per

2、son class Toolinterface Communicationpublic void speak();文件名都以外部类名+$+内部类名来命名Person.class、Person$Tool.class、Person$Communication.class.java文件中存在多个并行类(或接口)会产生多个.class文件public class Person class Monkeyinterface Thinkingvoid think();Person.class、Monkey.class、Thinking.class类型信息概述 java类文件中的属性、方法、以及类中的常量信类

3、文件中的属性、方法、以及类中的常量信息都被分别存储在息都被分别存储在.class文件中。文件中。 参考:参考:2Class的文件结构的文件结构长度:4字节描述:魔数OxCAFEBABE备注:Od-X命令可以看到。这样保证了java虚拟机能很轻松的分辨出java文件和非java文件。长度:分别两字节描述:主次版本号class文件备注:格式一旦发生变化,版本也会随之变化。如果class文件版本号超出了处理范围,java文件将不会处理文件。长度:不固定描述:包含了文件中类和接口相关的常量。文字字符串、final变量值、类名和方法名的常量。常量池的大小平均占到了整个类大小的60%左右。长度:2字节描述

4、:访问标志:定义了类或接口备注:指明是类还是接口、是抽象还是具体。长度:两字节描述:本身是一个常量池的索引,指向了常量池中该类全限定名的常量池入口。长度:2字节描述:指向父类全限定名长度:不固定描述:属性总数和属性本身长度:不固定描述:方法总数和方法本身长度:不固定描述:字段数量和字段的信息表。描述了字段的类型和描述符等。长度:不固定描述:该类实现的接口数量,interfaces包含了由该类实现的接口的常量池应用。java编译一个编译一个类文件类文件翻译类文件翻译类文件为该类动态的添为该类动态的添加一个公有的静加一个公有的静态常量属性态常量属性.class这个属性这个属性记录了类记录了类的相关

5、信的相关信息,即类息,即类型信息,型信息,它是它是Class类的一个类的一个实例。实例。类型信息概述类型信息概述类型信息的加载 JAVA提供两种类的装载方式:一是预先装载,二提供两种类的装载方式:一是预先装载,二是按需装载。由于可以对类进行按需加载,因此是按需装载。由于可以对类进行按需加载,因此在程序启动时并不需要把所有类都装载到在程序启动时并不需要把所有类都装载到JVM中。中。大部分的类要被延迟到使用时才动态加载,这称大部分的类要被延迟到使用时才动态加载,这称为为JAVA的运行时动态装载机制。的运行时动态装载机制。 JAVA基础类的加载基础类的加载当启动一个程序时,JAVA首先在JDK目录找

6、到并载入,然后启动虚拟机。启动虚拟机时会做一些初始化操作,如设置系统参数等。接着会创建一个Bootstrap Loader对象称为启动类装载器。含有含有main()函数类的加载函数类的加载 拥有拥有mian()函数的入口类即由函数的入口类即由AppClassLoader在程序启动时加载在程序启动时加载。Bootstrap LoaderExtClassLoader AppClassLoader1、预先加载、预先加载运行结果:JAVA采用运行时动态装载机制,需要某个类时,采用运行时动态装载机制,需要某个类时,JVM才会去动态的装才会去动态的装载它载它装载条件装载条件在程序的运行过程中,一个类的在程

7、序的运行过程中,一个类的静态成员静态成员(静态方法、静态属性、构造方法静态方法、静态属性、构造方法)被第一次引用时,被第一次引用时,JVM就会去装载它。就会去装载它。要注意的是:要注意的是:当访问静态常量属性时,当访问静态常量属性时, JVM加载类的过程中不会进行类的初始化工作加载类的过程中不会进行类的初始化工作 。构造方法作为类的静态成员的特例,构造方法作为类的静态成员的特例,既,当使用既,当使用new关键字来构造一个对象时,会被关键字来构造一个对象时,会被当作类静态成员的引用,同样会触发当作类静态成员的引用,同样会触发JVM来加载这个类来加载这个类。2、按需加载、按需加载例如:输出结果:输

8、出结果:按需加载流程图按需加载流程图 是用原生代码来实现的。它负责将 /lib 下面的类库 加载到内存中。不允许直接通过引用进 行操作引导类(Bootstrap)加载器 是由 Sun 的 AppClassLoader实现的。 它负责将系统类路径(CLASSPATH) 中指定的类库加载到内存中。开发者可 以直接使用系统类加载器。系统类(System)加载器 是由 Sun 的 ExtClassLoader实现的。 它负责将 /lib/ext 或者由系统变量 java.ext.dir 指定 位置中的类库加载到内存中。开发者可 以直接使用扩展类加载器。扩展类(Extension)加载器3、JVM三种预

9、定义类型类加载器三种预定义类型类加载器除引导类加载器,所有的类加载器都有一个父类加载器,并且,所有除引导类加载器,所有的类加载器都有一个父类加载器,并且,所有的类加载器都是类型。的类加载器都是类型。某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,才自己去加载。功返回;只有父类加载器无法完成此加载任务时,才自己去加载。参考:参考: 4、加载器的工作加载器的工作运行

10、结果:运行结果:当一个类具有继承关当一个类具有继承关系时,装载时从顶级系时,装载时从顶级类开始的,依次类推类开始的,依次类推直至加载到这个类本直至加载到这个类本身身5、父类和子类的加载顺序、父类和子类的加载顺序未初始化的静态引用未初始化的静态引用public class Course staticSystem.out.println(Course prepare!);public class Teacher staticSystem.out.println(Teacher prepare!);public static Course course;public class Bootstrap

11、public static void main(String args)new Teacher();初始化后:初始化后:把把Teacher类中的类中的public static Course course;改为改为public static Course course = new Course();对对course进行初始化,改后进行初始化,改后的运行结果:的运行结果:运行结果:运行结果:Teacher prepare!运行结果:运行结果:Teacher prepare!Course prepare!6类型信息的表示类型信息的表示类型信息概述7类型信息的表示类型信息的表示核心类介绍1Class

12、类类 Class类的对象用来表示运行时类或接口的信息。比如:每个数组均属于一个 Class 类对象,所有具有相同元素类型和维数的数组共享一个Class 对象。基本的 Java 类型(boolean, byte, char, short等)和 void 类型也可表示为 Class 对象。 Class对象是类型信息的核心,它直接对类的整体进行描述。 我们自己无法生成一个Class对象(构造函数为private),而这个Class类的对象是在当各类被调入时,由 Java 虚拟机自动创建 Class 对象,或通过类装载器中的 defineClass 方法生成Class类的获取方法1通过通过.class

13、属性属性Class类的获取方法这个方这个方法是用来取法是用来取得该类已经得该类已经被实例化了被实例化了的对象的该的对象的该类的引用,类的引用,这个引用指这个引用指向的是向的是Class类的类的对象。对象。2、通过、通过getClass()方法方法Class类的获取方法 该方法返回该方法返回给定串名相应的给定串名相应的Class对象。若给对象。若给定一个类或接口定一个类或接口的完整路径名,的完整路径名,那么此方法将试那么此方法将试图定位、装载和图定位、装载和连接该类。若成连接该类。若成功,返回该类对功,返回该类对象。否则,抛出象。否则,抛出 ClassNotFoundException 异常异常

14、。2、通过、通过forName()方法方法 输出结果:输出结果:核心类介绍专门用来描述构造函数,即专门用来描述构造函数,即Constructor类。类。Constructor类的对象用于描述类的单个构造方法。类的对象用于描述类的单个构造方法。可以通过它来获取类的构造方法名称、访问权限等,甚至可以用可以通过它来获取类的构造方法名称、访问权限等,甚至可以用Constructor来构建类的实例。来构建类的实例。2、获取、获取Constructor对象对象对于这四个不同的构造对于这四个不同的构造方法就会有方法就会有4个不同的个不同的Constructor对象来描对象来描述述。获取Constructio

15、n方法1、getConstructor(ClassparameterTypes) 此方法用于获此方法用于获取指定参数类型的取指定参数类型的Constructor对象,对象,其中参数其中参数parameterTypes为指定的参数类型。为指定的参数类型。获取的构造方获取的构造方法必须是公有的法必须是公有的。 输出结果:输出结果:获取Construction方法2、getConstructors()此方法用此方法用于获取指定类于获取指定类的公有构造函的公有构造函数描述对象数描述对象Constructor列表。列表。如果指定类没如果指定类没有公有的构造有公有的构造函数,则返回函数,则返回一个长度为一

16、个长度为0的的Constructor数组数组 输出结果:输出结果:获取Construction方法3、getDeclaredConstructor(ClassparameterTypes)此方法也是用于此方法也是用于获取指定参数类型的获取指定参数类型的构造函数描述对象构造函数描述对象Constructor,与,与getCon-structor(Class parameterTypes )不同的是,该方不同的是,该方法除了可以获取公有法除了可以获取公有的构造函数描述对象的构造函数描述对象外,还可以获取用于外,还可以获取用于描述受保护的或私有描述受保护的或私有的构造函数的的构造函数的Constru

17、ctor对象。对象。 输出结果:输出结果:获取Construction方法4、getDeclaredConstructors()此方法用于获取此方法用于获取指定类的所有构造函指定类的所有构造函数描述对象列表。与数描述对象列表。与getConstructors()方法不同的是,它除方法不同的是,它除了可以获取公有的构了可以获取公有的构造方法描述对象外,造方法描述对象外,还可以获取私有的构还可以获取私有的构造方法描述对象。造方法描述对象。 输出结果:输出结果:。获取Method对象1、native方法方法 一个一个Native Method就是一个就是一个java调用非调用非java代码代码的接口

18、。的接口。 在定义一个在定义一个native method时,时,并不提供实现体(有并不提供实现体(有些像定义一个些像定义一个java interface),因为),因为其实现体是由非其实现体是由非java语言在外面实现的。语言在外面实现的。核心类介绍3、获取、获取Method对象对象 Method类的对象用于描述类的单个方法类的对象用于描述类的单个方法(不包括构造不包括构造方法方法)。 可以通过可以通过Method类来获取方法的访问权限、参数类型、类来获取方法的访问权限、参数类型、返回值类型等信息。返回值类型等信息。 并且可以通过获取的并且可以通过获取的Method对象来动态执行方法。对象来

19、动态执行方法。获取Method对象2、getMethod(String name,ClassparameterTypes)此方法用于获取指定名称和参数类型的公有方法描述对象。此方法用于获取指定名称和参数类型的公有方法描述对象。可获取的方法出了本身定义的方法外,还包含了继承自父类的可获取的方法出了本身定义的方法外,还包含了继承自父类的方法。由于方法。由于java支持方法多态支持方法多态,因此会出现同名方法,所以获取因此会出现同名方法,所以获取一个方法描述对象时,必须同时指明方法名称和参数类型。如一个方法描述对象时,必须同时指明方法名称和参数类型。如果没有参数可不设置。果没有参数可不设置。获取Me

20、thod对象2、getMethod(String name,ClassparameterTypes) 输出结果:输出结果:获取Method对象3、getMethods()方法用方法用于获取公有于获取公有的方法描述的方法描述对象列表。对象列表。获取的列表获取的列表中,不仅包中,不仅包括本身类定括本身类定义的方法描义的方法描述对象,还述对象,还包含继承自包含继承自父类或接口父类或接口的方法描述的方法描述对象对象获取Method对象3、getMethods() 输出结果:输出结果:获取Method对象4、getDeclaredMethod(String name,ClassparameterType

21、s)此方法也用于获取指定名称和参数类型的方法描述对象。与此方法也用于获取指定名称和参数类型的方法描述对象。与方法方法getMethod(String name, Class. parameterTypes)不不同的是,此方法可以获取非公有的方法描述对象。同的是,此方法可以获取非公有的方法描述对象。 获取Method对象5、getDeclaredMethods() 此方法用于获取类本身定义的所有方法描述对象。注:获取此方法用于获取类本身定义的所有方法描述对象。注:获取的方法描述对象不包括继承自父类或接口的方法描述对象。此方法的方法描述对象不包括继承自父类或接口的方法描述对象。此方法与与getMe

22、thods不同的是,它只可以获取类本身定义的方法描述不同的是,它只可以获取类本身定义的方法描述对象,而且获取的包括公有的、受保护的以及私有的方法描述对象。对象,而且获取的包括公有的、受保护的以及私有的方法描述对象。获取Field对象获取获取field对象对象 Field类的对象用于描述类的单个字段。类的对象用于描述类的单个字段。 可以通过对可以通过对Field对象来获取字段的访问权限、字段类型等对象来获取字段的访问权限、字段类型等信息。信息。 并且可以通过获取的并且可以通过获取的Field对象来动态的修改字段值。对象来动态的修改字段值。获取Filed对象Field的获取方法的获取方法publi

23、c Field getField(String name)返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段public Field getFields()返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段public Field getDeclaredField(Stringname)返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段public Field getDeclaredFields()返回一个Field的数组,该数组记录指定类的所有属性的描述对

24、象。如果指定类没有属性,则返回一个空数组类型信息运用RTTIRTTI简介简介RTTI:Run Time Type Identification,运行时类型识别,运行时类型识别在程序运行时,动态的识别对象和类的信息在程序运行时,动态的识别对象和类的信息如:公司发放奖金时不同职位如:公司发放奖金时不同职位的人获得的奖金不同,就需识的人获得的奖金不同,就需识别他们的职位别他们的职位类型信息运用RTTI怎样进行运行时类型识别怎样进行运行时类型识别关键字关键字instanceof语法如下语法如下: employee instanceof Employee。 这样的一个表达式返回一个这样的一个表达式返回一

25、个boolean值,若为值,若为true,则表示是,则表示是指定类的一个实例,若返回指定类的一个实例,若返回false,则表示不是指定类的实例。则表示不是指定类的实例。例如:例如:If(x instanceof Dog) (Dog)x.bark(); Class. isInstance()原型:原型:public boolean isInstance(Object obj)参数是一个类的实例,参数是一个类的实例,对象对象contents1类型信息应用类型信息应用2.动态代理动态代理3动态代理类动态代理类4动态代理实例动态代理实例5.被代理的接口被代理的接口6动态代理的不足动态代理的不足类型信息

26、应用 JAVA反射机制是指在运行状态中,对于任意一个类,都能够知道这个反射机制是指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法,类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法,修改它的任意属性;这种动态获取的信息以及动态调用对象成员的功能称修改它的任意属性;这种动态获取的信息以及动态调用对象成员的功能称为为java语言的反射机制。语言的反射机制。反射反射类型信息应用 Java反射机制提供的功能:反射机制提供的功能: 用于用于 reflection 的类,如的类,如 Method,可以在,可以在 java.lang

27、.relfect 包中找到。包中找到。 使用这些类的时候必须要遵循三个步骤:使用这些类的时候必须要遵循三个步骤:类型信息应用在程序运行的过程中在程序运行的过程中,我们获取到了一个字符串,并且被告知这串字符串表示我们获取到了一个字符串,并且被告知这串字符串表示一个类,而且这个类继承了抽象的一个类,而且这个类继承了抽象的Person类。类。 例子:例子: 显示加载类:显示加载类: 实例实例class提供了forName(String name)方法来显示加载类运行结果:运行结果:类型信息应用1. Class类的类的newInstance()方法方法 该方法用于创建指定类的实例对象。该方法用于创建指定类的实例对象。 例子:例子: 通过反射实例化类通过反射实例化类运行结果:运行结果:类型信息应用Constructor类的类的newInstance()方法

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论