Chinaunix首页 | 论坛 | 博客
  • 博客访问: 14490445
  • 博文数量: 5645
  • 博客积分: 9880
  • 博客等级: 中将
  • 技术积分: 68081
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-28 13:35
文章分类

全部博文(5645)

文章存档

2008年(5645)

我的朋友

分类:

2008-04-28 21:38:21

下载本文示例代码
  摘要  开发者通过各种各样的方法来尝试避免单调冗余的编程。一些编程的规则例如继承、多态或者设计模型可以帮助开发者避免产生多余的代码。不过由于软件开发方面存在着不确定性,因此这些规则并不能消除代码维护和重新编写的需要。在很多时候维护都是不可避免的,只有不能运作的软件才是从不需要维护的。不过,这篇文章介绍了你可以使用Java的Reflection API的功能来减少单调的代码编写,并可以使用活动的代码产生来克服reflection的限制。  数据配置(由外部的源头得到数据并且将它装载到一个Java对象中)可以利用reflection的好处来创建一个可重用的方案。问题是很简单的:将数据由一个文件装入到一个对象的字段中。现在假设用作数据的目标Java类每星期改变一次?有一个很直接的解决方法,不过你必须不断地维护载入的过程来反映任何的改变。在更复杂的环境下,同样的问题可能会令系统崩溃掉。对于一个处理过运用XML的大型系统的人来说,他就会遇到过这个问题。要编写一个载入的过程通常是非常单调乏味的,由于数据源或者目标Java类的改变,你需要经常更新和重新编写代码。在这里我要介绍另一个解决方案,那就是使用映射,它通常使用更少的编码,并且可以在目标Java类发生改变后更新自己。  最初,我想介绍一个使用Reflection在运行期间配置数据的方案。在开始的时候,一个动态、基于映射的程序要比一个简单的方法更有吸引力多了。随后,我要揭示出运行时Reflection的复杂性和冒险性。这篇文章将介绍由运行时的Reflection到活动的代码产生。  由简单到复杂  我的第一个方案使用一个载入类将数据从一个文件载入到对象中。我的源代码含有对StringTokenizer对象下一节点方法的多次调用。在修改多次后,我的编码逻辑变得非常的直接、系统化。该类构造了专用的代码。在这个初始方案中,我只需要使用3个基本的对象:  1、Strings   2、Objects   3、Arrays of objects  你可以影射类的对象来产生代码块,如下表所示:  被影射来产生代码块的对象 Field type Code block String fileIterator.nextString(); Object[] Vector collector = new Vector(); while(fileIterator.hasMoreDataForArray()){ Object data = initializeObject(fileIterator)collector.add(data); } Object[] objArray = new Object[collector.size()]; collector.copyInto(objArray); Object initializeObject(fileIterator);                 **************表一**************  我已经使用这个方案作了几次编码,因此我在写代码之前我已经知道该方案和代码的结构。难点在于该类是变化的。类的名字、成份和结构在任何时候都可能发生变化,而任何的改变你都要重新编写代码。虽然会发生这些变化,但是结构和下载的流程仍然是一样的;在写代码前,我仍然知道代码的结构和成份。我需要一个方法,来将头脑中的编码流程转换为一个可重用的、自动的形式。由于我是一个有效率的编程者,我很快就厌倦了编写几乎一样的代码,这时我想到了映射。  数据配置通常需要一个源到目的数据的影射。影射可以是一个图解、DTD(document type definition,文档类型定义),文件格式等。在这个例子中,映射将一个对象的类定义解释为我们要映射的流程。映射可以在运行时复制代码的功能。在需要重写代码时,我将载入的过程用映射来代替,它所需要的时间和重写是一样的。  载入的工程可以概括为以下几步:  1、解释:一个影射决定你在构造一个对象时需要些什么  2、请求数据:要满足构造的需要,要进行一个调用来得到数据  3、拖:数据由源中得到。  4、推:数据被填充入一个对象的新实例  5、如果必要的话,重复步骤1  你需要以下的类来满足以上的步骤:  .数据类(Data classes):由ASCII文件中的数据实例化。类定义提供数据的影射。数据类必须满足以下的条件:  .它们必须包含有一个构造器来接收全部必需的参数,以使用一个有效的状态来构造对象;  .它们必须由对象构成,这些对象是reflective过程知道如何处理的  .对象装载器(Object loader):使用reflection和数据类作为一个影射来载入数据。产生数据请求。  .载入管理器(Load manager):作为对象装载器和数据源的中介层,将对数据的请求转换为一个数据指定的调用。这可以令对象载入器做到与数据源无关。通过它的接口和一个可载入的类对象通信。  .数据循环接口(Data iterator interface):载入管理器和载入类对象使用这个接口来由数据源中得到数据。  一旦你创建了支持的类,你就可以使用以下的声明来创建和影射一个对象: FooFileIterator iter = new FooFileIterator(fileLocation, log);LoadManager manager = new FooFileLoadManager(iter);SubFooObject obj = (SubFooObject)ReflectiveObjectLoader.initializeInstance(SubFooObject.class, manager,log);  通过这个处理,你就创建了一个包含有文件内容的SubFooObject实例。共3页。 1 2 3 :   摘要  开发者通过各种各样的方法来尝试避免单调冗余的编程。一些编程的规则例如继承、多态或者设计模型可以帮助开发者避免产生多余的代码。不过由于软件开发方面存在着不确定性,因此这些规则并不能消除代码维护和重新编写的需要。在很多时候维护都是不可避免的,只有不能运作的软件才是从不需要维护的。不过,这篇文章介绍了你可以使用Java的Reflection API的功能来减少单调的代码编写,并可以使用活动的代码产生来克服reflection的限制。  数据配置(由外部的源头得到数据并且将它装载到一个Java对象中)可以利用reflection的好处来创建一个可重用的方案。问题是很简单的:将数据由一个文件装入到一个对象的字段中。现在假设用作数据的目标Java类每星期改变一次?有一个很直接的解决方法,不过你必须不断地维护载入的过程来反映任何的改变。在更复杂的环境下,同样的问题可能会令系统崩溃掉。对于一个处理过运用XML的大型系统的人来说,他就会遇到过这个问题。要编写一个载入的过程通常是非常单调乏味的,由于数据源或者目标Java类的改变,你需要经常更新和重新编写代码。在这里我要介绍另一个解决方案,那就是使用映射,它通常使用更少的编码,并且可以在目标Java类发生改变后更新自己。  最初,我想介绍一个使用Reflection在运行期间配置数据的方案。在开始的时候,一个动态、基于映射的程序要比一个简单的方法更有吸引力多了。随后,我要揭示出运行时Reflection的复杂性和冒险性。这篇文章将介绍由运行时的Reflection到活动的代码产生。  由简单到复杂  我的第一个方案使用一个载入类将数据从一个文件载入到对象中。我的源代码含有对StringTokenizer对象下一节点方法的多次调用。在修改多次后,我的编码逻辑变得非常的直接、系统化。该类构造了专用的代码。在这个初始方案中,我只需要使用3个基本的对象:  1、Strings   2、Objects   3、Arrays of objects  你可以影射类的对象来产生代码块,如下表所示:  被影射来产生代码块的对象 Field type Code block String fileIterator.nextString(); Object[] Vector collector = new Vector(); while(fileIterator.hasMoreDataForArray()){ Object data = initializeObject(fileIterator)collector.add(data); } Object[] objArray = new Object[collector.size()]; collector.copyInto(objArray); Object initializeObject(fileIterator);                 **************表一**************  我已经使用这个方案作了几次编码,因此我在写代码之前我已经知道该方案和代码的结构。难点在于该类是变化的。类的名字、成份和结构在任何时候都可能发生变化,而任何的改变你都要重新编写代码。虽然会发生这些变化,但是结构和下载的流程仍然是一样的;在写代码前,我仍然知道代码的结构和成份。我需要一个方法,来将头脑中的编码流程转换为一个可重用的、自动的形式。由于我是一个有效率的编程者,我很快就厌倦了编写几乎一样的代码,这时我想到了映射。  数据配置通常需要一个源到目的数据的影射。影射可以是一个图解、DTD(document type definition,文档类型定义),文件格式等。在这个例子中,映射将一个对象的类定义解释为我们要映射的流程。映射可以在运行时复制代码的功能。在需要重写代码时,我将载入的过程用映射来代替,它所需要的时间和重写是一样的。  载入的工程可以概括为以下几步:  1、解释:一个影射决定你在构造一个对象时需要些什么  2、请求数据:要满足构造的需要,要进行一个调用来得到数据  3、拖:数据由源中得到。  4、推:数据被填充入一个对象的新实例  5、如果必要的话,重复步骤1  你需要以下的类来满足以上的步骤:  .数据类(Data classes):由ASCII文件中的数据实例化。类定义提供数据的影射。数据类必须满足以下的条件:  .它们必须包含有一个构造器来接收全部必需的参数,以使用一个有效的状态来构造对象;  .它们必须由对象构成,这些对象是reflective过程知道如何处理的  .对象装载器(Object loader):使用reflection和数据类作为一个影射来载入数据。产生数据请求。  .载入管理器(Load manager):作为对象装载器和数据源的中介层,将对数据的请求转换为一个数据指定的调用。这可以令对象载入器做到与数据源无关。通过它的接口和一个可载入的类对象通信。  .数据循环接口(Data iterator interface):载入管理器和载入类对象使用这个接口来由数据源中得到数据。  一旦你创建了支持的类,你就可以使用以下的声明来创建和影射一个对象: FooFileIterator iter = new FooFileIterator(fileLocation, log);LoadManager manager = new FooFileLoadManager(iter);SubFooObject obj = (SubFooObject)ReflectiveObjectLoader.initializeInstance(SubFooObject.class, manager,log);  通过这个处理,你就创建了一个包含有文件内容的SubFooObject实例。共3页。 1 2 3 : 下载本文示例代码


Java中利用Reflection API优化代码Java中利用Reflection API优化代码Java中利用Reflection API优化代码Java中利用Reflection API优化代码Java中利用Reflection API优化代码Java中利用Reflection API优化代码Java中利用Reflection API优化代码Java中利用Reflection API优化代码Java中利用Reflection API优化代码Java中利用Reflection API优化代码Java中利用Reflection API优化代码Java中利用Reflection API优化代码Java中利用Reflection API优化代码Java中利用Reflection API优化代码Java中利用Reflection API优化代码
阅读(183) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~