文档详情

12_Java类加载机制与反射.doc

发布:2018-10-10约1.54万字共15页下载文档
文本预览下载声明
12.1 Java类加载机制 前面我们给大家介绍过JVM的功能(提供运行时环境、垃圾回收机制和提供中立的体系结构)。在提供运行时环境中有个子功能是ClassLoader(类加载器),它主要用于将主类(即包含了main方法的类)加载到JVM的code segment(代码区)。然后运行环境找到main方法(程序入口)开始执行程序。在整个程序运行的过程中,会有更多的class被动态Load到内存中。类加载机制如图12-1所示: 图12-1 类加载机制 需要注意的是:类并非一次性就全部加载完毕,而是在需要的时候(运行期间)动态加载到内存。利用java -verbose:class Test可以观察类的具体加载过程。 12.2 Java反射机制 什么是反射 Java 程序在运行期间可以动态加载、解析和使用一些在编译阶段并不确定的类型数据,这一机制被称为反射(Reflection)。反射库(reflection library)提供了一个非常丰富且精心设计的工具类,以便编写能够动态操纵Java代码的程序。使用反射,在设计和运行中添加新类时,能够快速的应用开发工具动态的查询新添加类的能力。 反射方式 反射机制提供的功能 ·加载运行时才能确定的数据类型 ·解析类的结构、分析类的能力、获取其内部信息 ·操作类(进行实例化访问非静态成员,直接利用类名访问静态成员)或其实例(访问属性、调用方法、创建新对象) 12.2.1 Class类 在程序运行期间,Java运行时系统始终为所有的对象维护一个被称为运行时的类型标识,被称为Class(注意与class的区别)。通过 Class可以完整的得到一个类中的完整结构,包括此类中的方法定义,属性定义等。Class是反射的源头或入口,通过查看JDK帮助手册其常见方法如图: 12.2.2 12.2.2.1 针对引用数据类型 ·通过ClassLoader的loadClass方法 Class c1 = ClassLoader.getSystemClassLoader().loadClass(com.itjob.Person); ·调用静态方法Class.forName() Class.forName(com.itjob.Person); Class.forName(oracle.jdbc.dirver.OracleDriver); ·调用Object类中定义的getClass()方法 Person p = new Person(); Class c1 = p.getClass(); Class c2 = Hello.getClass(); ·使用.class表达式 Class c1 = String.class; Class c2 = com.itjob.Person.class; Class c3 = oracle.jdbc.dirver.OracleDriver.class; 12.2.2.2 针对基本数据类型及void ·使用.class 表达式 Class c1 = int.class; Class c2 = double.class; Class c3 = void.class; ·调用相应封装类的Type 属性 Class c1 = Integer.TYPE; Class c2 = Double.TYPE; Class c3 = Void.TYPE; 示例如下: try { //1. 引用数据类型 //1.1 利用ClassLoader类的loaderClass(类全名称);手动加载,会有异常 System.out.println(ClassLoader.getSystemClassLoader().loadClass(com.itjob.Person ).getName()); //1.2 利用Class.forName(类全名称);手动加载,会有异常 System.out.println(Class.forName(com.itjob.Person).getName()); //1.3 调用Object类中定义的getClass()方法 System.out.println(new Person().getClass().getName()); //1.4 使用.class表达式 System.out.println(Person.class.getName()); //2. 基本数据类型和void //2.1 使用.class表达式 System.out.println(int.class.getName()); System.out.println(double.class.getName());
显示全部
相似文档