java编程的动态性

java编程的动态性

ID:47019032

大小:153.50 KB

页数:9页

时间:2019-04-29

java编程的动态性_第1页
java编程的动态性_第2页
java编程的动态性_第3页
java编程的动态性_第4页
java编程的动态性_第5页
资源描述:

《java编程的动态性》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、Java编程的动态性,第2部分:引入反射使用运行时类信息来准备编程DennisM.Sosnoski(dms@sosnoski.com),总裁,SosnoskiSoftwareSolutions,Inc.2003年8月23日反射使您的程序代码能够接入装载到JVM中的类的内部信息,允许您编写与执行时,而不是源代码中选定的类协作的代码。这使反射成为构建灵活的应用的主要工具。但需注意的是--如果使用不当,反射的成本很高。在Java平台系列的第2部分中,软件顾问DennisSosnoski介绍了如何使用反射,以及某些相关的成本。您还将找到J

2、avaReflectionAPI如何使您能够在运行时关联对象。在“Java编程的动态性,第1部分,”我为您介绍了Java编程类和类装入。该篇文章介绍了一些Java二进制类格式的相关信息。这个月我将阐述使用Java反射API来在运行时接入和使用一些相同信息的基础。为了使已经熟知反射基础的开发人员关注本文,我将在文章中包括反射性能如何与直接接入相比较。使用反射不同于常规的Java编程,其中它与元数据--描述其它数据的数据协作。Java语言反射接入的特殊类型的原数据是JVM中类和对象的描述。反射使您能够运行时接入广泛的类信息。它甚至使您

3、能够读写字段,调用运行时选择的类的方法。反射是一种强大的工具。它使您能够创建灵活的代码,这些代码可以在运行时装配,无需在组件之间进行源代表链接。但反射的某些方面存在一些疑问。在本文中,我将深入讨论为什么您可能不希望在程序中使用反射,以及您应该这样做的理由。在了解了权衡性分析之后,您可以自行决定是否利大于弊。初学者的类使用反射的启点总是java.lang.Class实例。如果您希望与预先定义的类协作,那么Java语言提供一种直接获得Class实例的简便快捷方式:不要错过本系列的其它文章第1部分,“类和类装入”(2003年4月)Cla

4、ssclas=MyClass.class;当您使用这一项技术时,装入类涉及的所有工作在幕后进行。但是,如果您需要在运行时从某些外部源读取类名,这种方法并不适合。实际上,您需要使用一个类装入器来查找类信息。以下介绍一种方法://"name"istheclassnametoloadClassclas=null;try{clas=Class.forName(name);}catch(ClassNotFoundExceptionex){//handleexceptioncase}//usetheloadedclass如果已经装入了类,您将

5、得到现有的Class信息。如果类未被装入,类装入器将现在装入并返回新创建的类实例。回页首基于类的反射Class对象为您提供接入类元数据的反射的所有基本hook。这类元数据包括关于类自身的信息,如包和类的父类,以及该类实施的接口。它还包括该类定义的构造函数、字段和方法的详细信息。这些最后的项目都是编程中最经常使用的项目,因此我将在本小节的稍后部分给出一些与它们协作的实例。对于以下三类组件中的任何一类来说--构造函数、字段和方法--java.lang.Class提供四种独立的反射调用,以不同的方式来获得信息。调用都遵循一种标准格式。以

6、下是用于查找构造函数的一组反射调用:·ConstructorgetConstructor(Class[]params)--获得使用特殊的参数类型的公共构造函数,·Constructor[]getConstructors()--获得类的所有公共构造函数·ConstructorgetDeclaredConstructor(Class[]params)--获得使用特定参数类型的构造函数(与接入级别无关)·Constructor[]getDeclaredConstructors()--获得类的所有构造函数(与接入级别无关)每类这些调用都返

7、回一个或多个java.lang.reflect.Constructor函数。这种Constructor类定义newInstance方法,它采用一组对象作为其唯一的参数,然后返回新创建的原始类实例。该组对象是用于构造函数调用的参数值。作为解释这一工作流程的实例,假设您有一个TwoString类和一个使用一对Strings的构造函数,如清单1所示:清单1:从一对字符串创建的类 publicclassTwoString{privateStringm_s1,m_s2;publicTwoString(Strings1,Strings

8、2){m_s1=s1;m_s2=s2;}}清单2中的代码获得构造函数并使用它来创建使用Strings"a"和"b"的TwoString类的一个实例:清单2:构造函数的反射调用Class[]types=newClass[]{String.class,

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。