1. 1、本文档共18页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第十讲 reflection(反射) 目标 了解Class类的使用 理解反射的概念 了解使用反射分析类的功能 Class类 5-1 程序运行时,java运行时系统一直对所有的对象进行所谓的运行时类型识别(RTTI),以确定每个对象所属的类。JVM通常使用运行时类型信息来选择正确的方法去执行 在java中,保存运行时类型信息的类叫Class类 对于每一个被装载的类型(不管是类还是接口), JVM都会相应地为它创建一个Class对象。在你的应用程序中,你可以得到并使用指向Class对象的引用 Class类 5-2 类型的装载过程: 在运行期,一旦我们想生成一个类型的对象,JVM首先就会检查那个类型对应的Class对象是否已经存在。若不存在,JVM就会查找相应类型的.class文件,并将其作为二进制流载入,在把这个二进制流解析为内部数据结构之后,就创建一个Class对象来表示该类型。一旦有了Class对象,就可以用它来创建特定类型的所有实例。所以Java程序启动时并不是完全载入的,这一点与许多传统语言都不同 Class类 5-3 Object类中的getClass方法可以返回一个Class类型的实例: Employee e; Class c1=e. getClass(); Class类中最常用的方法是getName,它能返回一个类的名称: System.out.println(e. getClass(). getName()); 还可以使用Class类的静态方法forName()获得与字符串对应的Class对象: String className=“Manager”; Class c1=Class. forName(className); Class类 5-4 获取Class类型的第三个方法是“类标记”:如果T是一个java类型,那么T. class就代表了匹配的类对象。例: Class c1=Manager. class; Class c1=int. class; Class c1=Double[]. class; 注意: Class对象描述的只是类型,而这类型未必是类。数组类型的getName方法会返回奇怪的名字 JVM为每种类型管理一个独一无二的Class对象。因此,可以使用“==”操作符来比较对象: if(e. getClass()==Employee. class) … Class类 5-5 另一个有用的方法可以为类创建一个实例,这个方法叫做newInstance。例如: e. getClass(). newInstance(); 创建一个和e是同一类型的新对象。 newInstance调用默认的(无参的)构造函数来初始化新对象。 forName和newInstance结合起来用,使我们可以根据存储在字符串中的类名来创建对象: String s=“Manager”; Object m=Class. forName(s). newInstance(); 按需进行类的装载示例 理解JVM是按需要来进行类的装载的,而不是一下子把所有的类都装入内存。程序代码见SweetShop.java,程序运行结果如下: 反射 反射使我们能在程序运行时加载、探知、使用编译期间完全未知的类。换句话说,Java程序可以加载一个运行时才得知名称的类,获得该类的完整内容,并生成该类的对象、或者对该类实例的属性进行赋值、或者调用该类实例的方法。这种“看透class”的能力被称为introspection(内省或自省) 使用反射分析类的功能 3-1 能够分析类的能力的程序称为反射器。Java中提供此功能的包是java. lang. reflect java. lang. reflect包中的三个类Field、Method、Constructor分别描述类的属性、方法和构造函数: 它们都有一个getName方法,用来返回相应条目的名称 Field类有个getType方法, 返回一个用来描述属性类型的Class对象 Method和Constructor类都有报告这些方法的返回类型和参数类型的方法 使用反射分析类的功能 3-2 这三个类都有一个getModifiers方法,它返回一个整数,其不同位的设置描述了所使用的修饰符,如public和static。你可以使用java. lang. reflect包中的Modifier类的静态方法来分析getModifiers方法所返回的整数。例如, Modifier类中有三个方法isPublic、isPrivate、isFinal分别可以用来判断一个方法或构造函数是否是public、private或者final的 使用反射分析类的功能 3-3 Class类中的getFields、g

您可能关注的文档

文档评论(0)

yan666888 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档