大雀软件园

首页 软件下载 安卓市场 苹果市场 电脑游戏 安卓游戏 文章资讯 驱动下载
技术开发 网页设计 图形图象 数据库 网络媒体 网络安全 站长CLUB 操作系统 媒体动画 安卓相关
当前位置: 首页 -> 技术开发 -> JSP专区 -> 体验Java 1.5中面向(AOP)编程

体验Java 1.5中面向(AOP)编程

时间: 2021-07-31 作者:daque

对于一个不妨考察源代码的体味充分的java开拓职员来说,任何步调都不妨被看作是博物寺里通明的模子。一致线程转储(dump)、本领挪用盯梢、断点、切面(profiling)统计表等东西不妨让咱们领会步调暂时正在实行什么操纵、方才做了什么操纵、将来将做什么操纵。然而在产物情况中情景就没有那么鲜明了,那些东西普遍是不不妨运用的,或最多只能由受过演练的开拓者运用。扶助共青团和少先队和最后用户也须要领会在某个功夫运用步调正在实行什么操纵。   为了弥补这个空白,咱们仍旧发领会少许大略的代替品,比方日记文献(典范情景下用来效劳器处置)和状况条(用来gui运用步调)。然而,因为那些东西只能捕获和汇报可用消息的一个很小的子集,而且常常必需把那些消息用简单领会的办法展现出来,以是步调员趋势于把它们精确地编写到运用步调中。而那些代码会纠葛着运用步调的交易论理,当开拓者试图调节和测试或领会中心功效的功夫,她们必需"环绕那些代码处事",并且还要牢记功效爆发变换后革新那些代码。咱们蓄意实行的真实功效是把状况汇报会合在某个场所,把单个状况动静动作元数据(metadata)来处置。   在正文中我将商量运用嵌入gui运用步调中的状况条组件的景象。我将引见多种实行这种状况汇报的各别本领,从保守的硬源代码风气发端。随后我会引见java 1.5的洪量新个性,囊括证明(annotation)和运转时字节码重构(instrumentation)。   状况处置器(statusmanager)   我的重要目的是创造一个不妨嵌入gui运用步调的jstatusbar swing组件。图1表露了一个大略的jframe中状况条的款式。       图1.咱们动静天生的状况条

  因为我不蓄意径直在交易论理中援用任何gui组件,我将创造一个statusmanager(状况处置器)来充任状况革新的进口点。本质的报告会被委派给statusstate东西,所以此后不妨扩充它以扶助多个并发的线程。图2表露了这种安置。   

体验java 1.5中面向(aop)编程图1

图2. statusmanager和jstatusbar

体验java 1.5中面向(aop)编程图2

  此刻我必需编写代码挪用statusmanager的本领来汇报运用步调的过程。典范情景下,那些本领挪用都分别地贯串于try-finally代码块中,常常每个本领一个挪用。      public void connecttodb (string url) {    statusmanager.push("connecting to database");    try {     ...    } finally {     statusmanager.pop();    }   }   那些代码实行了咱们所须要功效,然而在代码库中数十次、以至于数百次地复制那些代码之后,它看上去就有些凌乱了。其余,即使咱们蓄意用少许其它的办法考察那些动静该如何办呢?在正文的反面局部中,我将设置一个用户和睦的特殊处置步调,它共享了沟通的动静。题目是我把状况动静湮没在本领的实行之中了,而没有把动静放在动静分属的接口中。   面向属性编制程序   我真实想实行的操纵是把对statusmanager的援用都放到代码表面的某个场合,并大略地用咱们的动静标志这个本领。接着我不妨运用代码天生(code-generation)或运转时反思(introspection)来实行真实的处事。xdoclet名目把这种本领归结为面向属性编制程序(attribute-oriented programming),它还供给了一个框架组件,不妨把自设置的一致javadoc的标志变换到源代码之中。   然而,jsr-175包括了如许的实质,java 1.5为了包括如实代码中的那些属性供给了一种构造化水平更高的方法。那些属性被称为"证明(annotations)",咱们不妨运用它们为类、本领、字段或变量设置供给元数据。它们必需被显式证明,并供给一组不妨包括大肆恒量值(囊括原语、字符串、列举和类)的称呼-值对(name-value pair)。   证明(annotations)   为了处置状况动静,我蓄意设置一个包括字符串值的新证明。证明的设置特殊一致接口的设置,然而它用@interface要害字包办了interface,而且只扶助本领(纵然它们的功效更像字段):      public @interface status {    string value();   }   与接口一致,我把@interface放入一个叫作status.java的文献中,并把它导出就任何须要援用它的文献中。   对咱们的字段来说,value大概是个怪僻的称呼。一致message的称呼大概更符合;然而,value对于java来说具备特出的意旨。它承诺咱们运用@status("...")包办@status(value="...")来设置证明,这鲜明越发简略。   我此刻不妨运用底下的代码设置本人的本领:   @status("connecting to database")   public void connecttodb (string url) {   ...   }   请提防,咱们在编写翻译这段代码的功夫必需运用-source 1.5选项。即使你运用ant而不是径直运用javac吩咐行创造运用步调,那么你须要运用ant 1.6.1之上本子。   动作类、本领、字段和变量的弥补,证明也不妨用来为其它的证明供给元数据。更加地,java引入了小批证明,你不妨运用那些证明来定制你本人的证明的处事办法。咱们用底下的代码从新设置本人的证明:   @target(elementtype.method)   @retention(retentionpolicy.source)   public @interface status {   string value();   }   @target证明设置了@status证明不妨援用什么实质。理念情景下,我蓄意标志大块的代码,然而它的选项惟有本领、字段、类、当地变量、参数和其它证明。我只对代码感爱好,所以我采用了method(本领)。   @retention证明承诺咱们指定java什么功夫不妨自决地唾弃动静。它大概是source(在编写翻译时唾弃)、class(在类载时髦唾弃)或runtime(不唾弃)。咱们先采用source,然而在正文后部咱们会革新它。     重构源代码   此刻我的动静都被源代码放入元数据中了,我必需编写少许代码来报告状况监听步调。假如在某个功夫,我连接把connecttodb本领生存源代码控件中,然而却没有对statusmanager的任何援用。然而,在编写翻译这个类之前,我蓄意介入少许需要的挪用。也即是说,我蓄意机动地插入try-finally语句和push/pop挪用。   xdoclet框架组件是一种java源代码天生引擎,它运用了一致上述的证明,然而把它们保存在java源代码的解释(comment)中。xdoclet天生所有java类、摆设文献或其它创造的局部的功夫特殊完备,然而它不扶助对已有java类的窜改,而这控制了重构的灵验性。动作包办,我不妨运用领会东西(比方javacc或antlr,它供给了领会java源代码的语法普通),然而这须要耗费洪量精神。   看上去没有什么不妨用来java代码的源代码重构的很好的东西。这类东西大概有商场,然而你在正文的反面局部不妨看到,字节码重构大概是一种更宏大的本领。 重构字节码   不是重构源代码而后编写翻译它,而是编写翻译原始的源代码,而后重构它所爆发的字节码。如许的操纵大概比源代码重构更简单,也大概越发搀杂,而这依附于须要的精确变换。字节码重构的重要便宜是代码不妨在运转时被窜改,不须要运用编写翻译器。   纵然java的字节码方法对立大略,我仍旧蓄意运用一个java类库来实行字节码的领会和天生(这不妨把咱们与将来java类文献方法的变换隔摆脱来)。我采用了运用jakarta的byte code engineering library(字节码引擎类库,bcel),然而我还不妨采用cglib、asm或serp。   因为我将运用多种各别的办法重构字节码,我将从证明重构的通用接口发端。它一致于实行鉴于证明重构的大略框架组件。这个框架组件鉴于证明,将扶助类和本领的变换,所以该接口有一致底下的设置:     public interface instrumentor   {    public void instrumentclass (classgen classgen,annotation a);    public void instrumentmethod (classgen classgen,methodgen methodgen,annotation a);   }   classgen和methodgen都是bcel类,它们运用了builder形式(pattern)。也即是说,它们为变换其它不行变的(immutable)东西、以及可变的和不行变的展现(representation)之间的变换供给了本领。   此刻我须要为接口编写实行,它必需用适合的statusmanager挪用调换@status证明。前方提到,我蓄意把那些挪用包括在try-finally代码块中。请提防,要到达这个目的,咱们所运用的证明必需用@retention(retentionpolicy.class)举行标志,它引导java编写翻译器在编写翻译进程中不要唾弃证明。因为在前方我把@status证明为@retention(retentionpolicy.source)的,我必需革新它。   在这种情景下,重构字节码鲜明比例构源代码更搀杂。其因为在乎try-finally是一种只是生存于源代码中的观念。java编写翻译器把try-finally代码块变换为一系列的try-catch代码块,并在每一个归来之前插入对finally代码块的挪用。所以,为了把try-finally代码块增添到已有的字节码中,我也必需实行一致的工作。   底下是展现一个普遍本领挪用的字节码,它被statusmanager革新盘绕着:     0: ldc #2; //字符串动静   2: invokestatic #3; //本领statusmanager.push:(lstring;)v   5: invokestatic #4; //本领 dosomething:()v   8: invokestatic #5; //本领 statusmanager.pop:()v   11: return   底下是沟通的本领挪用,然而坐落try-finally代码块中,所以,即使它爆发了特殊会挪用statusmanager.pop():     0: ldc #2; //字符串动静   2: invokestatic #3; //本领 statusmanager.push:(lstring;)v   5: invokestatic #4; //本领 dosomething:()v   8: invokestatic #5; //本领 statusmanager.pop:()v   11: goto 20   14: astore_0   15: invokestatic #5; //本领 statusmanager.pop:()v   18: aload_0   19: athrow   20: return     exception table:   from to target type   5 8 14 any   14 15 14 any   你不妨创造,为了实行一个try-finally,我必需复制少许训令,并增添了几个跳转和特殊表记载。倒霉的是,bcel的instructionlist类使这种处事十分大略。   在运转时重构字节码   此刻我具有了一个鉴于证明窜改类的接口和该接口的简直实行了,下一步是编写挪用它的本质框架组件。本质上我将编写小批的框架组件,先从运转时重构一切类的框架组件发端。因为这种操纵会在build进程中爆发,我确定为它设置一个ant工作。build.xml文献中的重构目的的证明该当如次:     <instrument class="com.pkg.ourinstrumentor">   <fileset dir="$(classes.dir)">   <include name="**/*.class"/>   </fileset>   </instrument>   为了实行这种工作,我必需设置一个实行org.apache.tools.ant.task接口的类。咱们的工作的属性和子元素(sub-elements)都是经过set和add本领挪用传播进入的。咱们挪用实行(execute)本领来实行工作所要实行的处事--在示例中,即是重构<fileset>中指定的类文献。    public class instrumenttask extends task {    ...    public void setclass (string classname) { ... }    public void addfileset (fileset fileset) { ... }      public void execute () throws buildexception {     instrumentor inst = getinstrumentor();   try {      directoryscanner ds =fileset.getdirectoryscanner(project);      // java 1.5 的"for" 语法      for (string file : ds.getincludedfiles()) {       instrumentfile(inst, file);      }     } catch (exception ex) {      throw new buildexception(ex);     }    }    ...   }   用来该项操纵的bcel 5.1本子有一个题目--它不扶助领会证明。我不妨载入正在重构的类并运用曲射(reflection)察看证明。然而,即使如许,我就不得不运用retentionpolicy.runtime来包办retentionpolicy.class。我还必需在那些类中实行少许静态的初始化,而那些操纵大概载入当地类库或引入其它的依附联系。倒霉的是,bcel供给了一种插件(plugin)体制,它承诺存户端领会字节码属性。我编写了本人的attributereader的实行(implementation),在展示证明的功夫,它领会怎样领会插入字节码中的runtimevisibleannotations和runtimeinvisibleannotations属性。bcel将来的本子该当会包括这种功效而不是动作插件供给。   编写翻译功夫的字节码重构本领表露在示例代码的code/02_compiletime目次中。   然而这种本领有很多缺点。开始,我必需给创造进程减少特殊的办法。我不许鉴于吩咐行树立或其它编写翻译时没有供给的消息来确定翻开或封闭重构操纵。即使重构的或没有重构的代码须要同声在产物情况中运转,那么就必需创造两个独立的.jars文献,并且还必需确定运用哪一个。

体验java 1.5中面向(aop)编程图3

    在类载时髦重构字节码   更好的本领大概是推迟字节码重构操纵,直到字节码被载入的功夫才举行重构。运用这种本领的功夫,重构的字节码不必生存起来。咱们的运用步调启用功夫的本能大概会遭到感化,然而你却不妨鉴于本人的体例属性或运转时摆设数据来遏制举行什么操纵。   java 1.5之前,咱们运用定制的类载入步调大概实行这品种文献保护操纵。然而java 1.第5中学新减少的java.lang.instrument步调包供给了少量附加的东西。更加地,它设置了classfiletransformer的观念,在规范的载入进程中咱们不妨运用它来重构一个类。   为了在符合的功夫(在载入任何类之前)备案classfiletransformer,我须要设置一个premain本领。java在载入主类(main class)之前将挪用这个本领,而且它传播进入对instrumentation东西的援用。我还必需给吩咐行减少-javaagent参数选项,报告java咱们的premain本领的消息。这个参数选项把咱们的agent class(代劳类,它包括了premain本领)的全名和大肆字符串动作参数。在例子中咱们把instrumentor类的全名动作参数(它必需在同一条龙之中):   -javaagent:boxpeeking.instrument.instrumentoradaptor=   boxpeeking.status.instrument.statusinstrumentor   此刻我仍旧安置了一个回调(callback),它在载入任何含有证明的类之前城市爆发,而且我具有instrumentation东西的援用,不妨备案咱们的classfiletransformer了:   public static void premain (string classname,   instrumentation i)   throws classnotfoundexception,   instantiationexception,   illegalaccessexception   {    class instclass = class.forname(classname);    instrumentor inst = (instrumentor)instclass.newinstance();    i.addtransformer(new instrumentoradaptor(inst));   }   咱们在此处备案的适配重将充任上头给出的instrumentor接口和java的classfiletransformer接口之间的桥梁。      public class instrumentoradaptor   implements classfiletransformer   {    public byte[] transform (classloader cl,string classname,class classbeingredefined,   protectiondomain protectiondomain,byte[] classfilebuffer)    {     try {      classparser cp =new classparser(new bytearrayinputstream(classfilebuffer),classname + ".java");      javaclass jc = cp.parse();    classgen cg = new classgen(jc);    for (annotation an : getannotations(jc.getattributes())) {       instrumentor.instrumentclass(cg, an);      }    for (org.apache.bcel.classfile.method m : cg.getmethods()) {       for (annotation an : getannotations(m.getattributes())) {        constantpoolgen cpg =cg.getconstantpool();        methodgen mg =new methodgen(m, classname, cpg);        instrumentor.instrumentmethod(cg, mg, an);        mg.setmaxstack();        mg.setmaxlocals();        cg.replacemethod(m, mg.getmethod());       }      }      javaclass jcnew = cg.getjavaclass();      return jcnew.getbytes();     } catch (exception ex) {      throw new runtimeexception("instrumenting " + classname, ex);     }    }    ...   }   这种在启用时重构字节码的本领坐落在示例的/code/03_startup目次中。   特殊的处置   作品前方提到,我蓄意编写附加的代码运用各别手段的@status证明。咱们来商量一下少许特殊的需要:咱们的运用步调必需捕获一切的未处置特殊并把它们表露给用户。然而,咱们不是供给java仓库盯梢,而是表露具有@status证明的本领,并且还不该当表露任何代码(类或本领的称呼或行号之类)。   比方,商量底下的仓库盯梢消息:   java.lang.runtimeexception: could not load data for symbol ibm   at boxpeeking.code.yourcode.loaddata(unknown source)   at boxpeeking.code.yourcode.go(unknown source)   at boxpeeking.yourcode.ui.main+2.run(unknown source)   at java.lang.thread.run(thread.java:566)   caused by: java.lang.runtimeexception: timed out   at boxpeeking.code.yourcode.connecttodb(unknown source)   ... 更多消息   这将引导图第11中学所示的gui弹出框,上头的例子假如你的yourcode.loaddata()、yourcode.go()和yourcode.connecttodb()都含有@status证明。请提防,特殊的步骤是差异的,所以用户最先获得的是最精细的消息。  

  

体验java 1.5中面向(aop)编程图4

图3.表露在缺点对话框中的仓库盯梢消息

  为了实行那些功效,我必需对已有的代码举行略微的窜改。开始,为了保证在运转时@status证明是不妨看到的,我就必需再次革新@retention,把它树立为@retention(retentionpolicy.runtime)。请记取,@retention遏制着jvm什么功夫唾弃证明消息。如许的树立表示着证明不只不妨被编写翻译器插入字节码中,还不妨运用新的method.getannotation(class)本领经过曲射来举行考察。   此刻我须要安置接受代码中没有精确处置的任何特殊的报告了。在java 1.4中,处置任何一定线程上未处置特殊的最佳本领是运用threadgroup子类并给该典型的threadgroup增添本人的新线程。然而java 1.5供给了特殊的功效。我不妨设置uncaughtexceptionhandler接口的一个范例,并为任何一定的线程(或一切线程)备案它。   请提防,在例子中为一定特殊备案大概更好,然而在java 1.5.0beta1(#4986764)中有一个bug,它使如许操纵没辙举行。然而为一切线程树立一个处置步调是不妨处事的,所以我就如许操纵了。   此刻咱们具有了一种截取未处置特殊的本领了,而且那些特殊必需被汇报给用户。在gui运用步调中,典范情景下如许的操纵是经过弹出一个包括所有仓库盯梢消息或大略动静的形式对话框来实行的。在例子中,我蓄意在爆发特殊的功夫表露一个动静,然而我蓄意供给仓库的@status刻画而不是类和本领的称呼。为了实行这个手段,我大略地在thread的stacktraceelement数组中查问,找到与每个框架关系的java.lang.reflect.method东西,并查问它的仓库证明列表。悲惨的是,它只供给了本领的称呼,没有供给本领的特性量(signature),所以这种本领不扶助称呼沟通的(但@status证明各别的)重载本领。   实行这种本领的示例代码不妨在peekinginside-pt2.tar.gz文献的/code/04_exceptions目次中找到。     取样(sampling)   我此刻有方法把stacktraceelement数组变换为@status证明仓库。这种操纵比表白看到的越发有效。java 1.第5中学的另一个新个性--线程反思(introspection)--使咱们不妨从暂时正在运转的线程中获得精确的stacktraceelement数组。有了这两局部消息之后,咱们就不妨结构jstatusbar的另一种实行。statusmanager将不会在爆发本领挪用的功夫接受报告,而是大略地启用一个附加的线程,让它控制在平常的间隙功夫抓取仓库盯梢消息和每个办法的状况。只有这个间隙功夫充满短,用户就不会发觉到革新的推迟。   底下使"sampler"线程背地的代码,它盯梢另一个线程的过程:   class statussampler implements runnable   {    private thread watchthread;      public statussampler (thread watchthread)    {     this.watchthread = watchthread;    }      public void run ()    {     while (watchthread.isalive()) {      // 从线程中获得仓库盯梢消息      stacktraceelement[] stacktrace =watchthread.getstacktrace();      // 从仓库盯梢消息中索取状况动静      list<status> statuslist =statusfinder.getstatus(stacktrace);      collections.reverse(statuslist);      // 用状况动静创造那种状况      statusstate state = new statusstate();      for (status s : statuslist) {       string message = s.value();       state.push(message);      }    // 革新暂时的状况      statusmanager.setstate(watchthread,state);      //睡眠到下一个周期      try {       thread .sleep(sampling_delay);      } catch (interruptedexception ex) {}     }   //状况复位     statusmanager.setstate(watchthread,new statusstate());    }   }   与减少本领挪用、手动或经过重构比拟,取样对步调的侵吞性(invasive)更小。我基础不须要变换创造进程或吩咐行参数,或窜改启用进程。它也承诺我经过安排sampling_delay来遏制占用的开支。悲惨的是,当本领挪用发端或中断的功夫,这种本领没有精确的回调。除去状况革新的推迟除外,没有因为诉求这段代码在谁人功夫接受回调。然而,将来我不妨减少少许特殊的代码来盯梢每个本领的精确的运转时。经过查看stacktraceelement是不妨透彻地实行如许的操纵的。   经过线程取样实行jstatusbar的代码不妨在peekinginside-pt2.tar.gz文献的/code/05_sampling目次中找到。   在实行进程中重构字节码   经过把取样的本领与重构拉拢在一道,我不妨产生一种最后的实行,它供给了百般本领的最好个性。默许情景下不妨运用取样,然而运用步调的耗费功夫最多的本领不妨被部分地举行重构。这种实行基础不会安置classtransformer,然而动作包办,它会一次一个地重构本领以相应取样进程中搜集到的数据。   为了实行这种功效,我将创造一个新类instrumentationmanager,它不妨用来重构和不重构独力的本领。它不妨运用新的instrumentation.redefineclasses本领来窜改清闲的类,同期间码则不妨不中断实行。前方局部中减少的statussampler线程此刻有了特殊的工作,它把任何本人"创造"的@status本领增添到汇合中。它将周期性地找到最坏的触犯者并把它们供给给instrumentationmanager以供重构。这承诺运用步调越发透彻地盯梢每个本领的启用和中断功夫。   前方提到的取样本领的一个题目是它不许辨别长功夫运转的本领与在轮回中屡次挪用的本领。因为重构会给历次本领挪用减少确定的开支,咱们有需要忽视一再挪用的本领。倒霉的是,咱们不妨运用重构处置这个题目。除去大略地革新statusmanager除外,咱们将保护每个重构的本领被挪用的度数。即使这个数值胜过了某个极限(表示着保护这个本领的消息的开支太大了),取样线程将会长久地废除对该本领的重构。   理念情景下,我将把每个本领的挪用数目保存在重构进程中增添到类的新字段中。悲惨的是,java 1.第5中学减少的类变换体制不承诺如许操纵;它不许减少或简略任何字段。动作包办,我将把那些消息保存在新的callcounter类的method东西的静态映照中。   这种搀和的本领不妨在示例代码的/code/06_dynamic目次中找到。   详细   图4供给了一个矩形,它表露了我给出的例子关系的个性和价格。   

  

图4.重构本领的领会

  你不妨创造,动静的(dynamic)本领是百般计划的杰出拉拢。与运用重构的一切示例一致,它供给了本领发端或中断功夫的精确的回调,所以你的运用步调不妨精确地盯梢运转时并登时为用户供给反应消息。然而,它还不妨废除那种本领的重构(它被过于一再地挪用),所以它不会遭到其它的重构计划遇到的本能题目的感化。它没有包括编写翻译时办法,而且它没有减少类载入进程中的特殊的处事。   将来的趋向   咱们不妨给这个名目减少洪量的附属类小部件个性,使它越发实用。个中最有效的个性大概是动静的状况消息。咱们不妨运用新的java.util.formatter类把一致printf的形式替代(pattern substitution)用来@status动静中。比方,咱们的connecttodb(string url)本领中的@status("connecting to %s")证明不妨把url动作动静的一局部汇报给用户。   在源代码重构的扶助下,这大概显得微乎其微,由于我将运用的formatter.format本领运用了可变参数(java 1.第5中学减少的"把戏"功效)。重构过的本子一致底下的景象:   public void connecttodb (string url) {    formatter f = new formatter();    string message = f.format("connecting to %s", url);      statusmanager.push(message);    try {     ...    } finally {     statusmanager.pop();    }   }   悲惨的是,这种"把戏"功效是实足在编写翻译器中实行的。在字节码中,formatter.format把object[]动作参数,编写翻译器精确地增添代码来包装每个原始的典型并安装该数组。即使bcel没有赶紧填补,而我又须要运用字节码重构,我将不得不从新实行这种论理。   因为它只能用来重构(这种情景下本领参数是可用的)而不许用来取样,你大概蓄意在启用的功夫重构那些本领,或最少使动静实行偏差于任何本领的重构,还不妨在动静中运用代替形式。   你还不妨盯梢每个重构的本领挪用的启用度数,所以你还不妨越发透彻地汇报每个本领的运转度数。你以至于不妨生存那些度数的汗青统计数据,并运用它们产生一个真实的进度条(包办我运用的不决定的本子)。这种本领将付与你在运转时重构那种本领的一个很好的来由,由于盯梢任何独力的本领的开支都是很能很鲜明的。   你不妨给进度条减少"调节和测试"形式,它尽管本领挪用能否包括@status证明,汇报取样进程中展示的一切本领挪用。这对于任何蓄意调节和测试死锁或本能题目的开拓者来说都是价值连城。本质上,java 1.5还为死锁(deadlock)检验和测定供给了一个可编制程序的api,在运用步调锁住的功夫,咱们不妨运用该api把过程条形成赤色。   正文中创造的鉴于证明的重构框架组件大概很有商场。一个承诺字节码在编写翻译时(经过ant工作)、启   动时(运用classtransformer)和实行进程中(运用instrumentation)举行重构的东西对于小批其它新名目来说毫无疑义地特殊有价格。   归纳   在这几个例子中你不妨看到,元数据编制程序(meta-programming)大概是一种特殊宏大的本领。汇报长功夫运转的操纵的过程只是是这种本领的运用之一,而咱们的jstatusbar只是是勾通那些消息的一种媒体。咱们不妨看到,java 1.第5中学供给的很多新个性为元数据编制程序供给了巩固的扶助。更加地,把证明和运转时重构拉拢在一道为面向属性的编制程序供给了真实动静的情势。咱们不妨进一步运用那些本领,使它的功效胜过已有的框架组件(比方xdoclet供给的框架组件的功效)。  

热门阅览

最新排行

Copyright © 2019-2021 大雀软件园(www.daque.cn) All Rights Reserved.