没有合适的资源?快使用搜索试试~ 我知道了~
理论计算机科学电子笔记113(2005)181-200www.elsevier.com/locate/entcsjMonitor:Java事件规范和监控库穆拉特·卡鲁曼1德州仪器公司315 Bollay Drive,Santa Barbara,California USA 93117杰伊·弗里曼2加州大学创造性研究学院美国加利福尼亚州圣巴巴拉市93106摘要jMonitor是一个纯Java库和运行时实用程序,用于指定事件模式,并将其与用户提供的事件监视器相关联,这些事件监视器在执行遗留Java应用程序期间发生指定的运行时事件时被调用。jMonitor API定义了一个事件规范抽象层,允许程序员设计事件模式来监控遗留Java应用程序的运行时执行。jMonitor instrumentation在Java字节码级别工作,并且不需要被监视的Java应用程序的源代码。jMonitor重载动态类加载器,并在启动目标Java应用程序时将事件指定和监视器(以Java类文件的形式)作为附加参数。根据外部指定的jMonitor事件模式和事件监视器的需要,jMonitor类加载器在Java程序上对被监视的Java程序的类字节码进行检测关键词:面向对象编程,事件监视,字节码插装,运行时验证,jMonitor。1介绍jMonitor是一个纯Java库和运行时实用程序,它允许程序员指定事件模式来监视遗留Java应用程序的运行时执行。1电子邮件:muratk@ti.com2 电子邮件地址:saurik@saurik.com1571-0661 © 2004 Elsevier B. V.根据CC BY-NC-ND许可证开放访问。doi:10.1016/j.entcs.2004.01.027182M. Freeman / Electronic Notes in Theoretical Computer Science 113(2005)181-200选项。jMonitor通过重载动态类加载器来工作。jMonitor类加载器根据外部指定的事件模式和事件监视器,对Java程序的类字节码进行仪表化。jMonitor直接检测类字节码,而不需要被监视的Java应用程序的源代码。在执行一个插装应用程序的过程中,每个与任何指定事件模式匹配的Java字节码指令都会触发一个或多个相关监视器方法的调用。使用以下关于触发事件的运行时上下文信息调用监视器方法:事件类型,其目标对象,表示事件发生的方法的调用堆栈,以及方法的参数,这些参数共同定义了事件发生时的完整调用上下文jMonitor事件对应于基本的Java编程抽象,例如读取或写入类中的字段、方法调用、方法返回或抛出异常以及创建新对象或数组。每个事件都有一个Java应用程序上下文,比如字段或方法的名称,以及类和方法上下文的名称名称被指定为表示POSIX兼容正则表达式的字符串。多个不同的事件监视器可以与任何事件相关联。jMonitor检测应用程序以捕获调用上下文并使用此信息调用监视器函数。每个监控函数在相关事件之前、之后或代替相关事件调用,具体取决于事件指定。jMonitor提供了一个灵活而强大的事件建模和监控范例,它为程序员提供了一些面向方面编程的相同好处。本文的结构如下。 在第2节中,我们将介绍jMonitor事件、事件模式和事件监视器。在第3节中,我们描述了不同类型的事件监视器以及通过jMon itor插装收集并提供给事件监视器的运行时上下文信息的类型。在第4节中,我们介绍了设计和实现概述。第5节介绍了jMonitor如何与该领域的现有工作相关联。2jMonitor事件模式在本节中,我们将介绍jMonitor事件模式。每个事件模式描述一个特定的Java运行时事件,比如字段的读写,或者方法调用,以及约束调用上下文。调用上下文静态地将指定的运行时事件绑定到遗留应用程序域。jMonitor使用给定的事件规范来检测遗留用户应用程序,以检测事件何时被触发并调用任何关联的监视器函数。图-M. Freeman / Electronic Notes in Theoretical Computer Science 113(2005)181183图1说明了使用jMonitor API指定事件模式并将事件监视器附加到每个事件模式的一般思想。jMonitor类和方法签名的完整列表如图4所示。Fig. 1.用户定义的事件规范和事件管理在启动期间,jMonitor检测类加载器调用用户提供的事件模式指定类的静态setEventPatterns方法。图2显示了有关遗留应用程序和事件监视层的信息流程。用户指定的每个事件模式随后引导jMonitor类加载器在加载之前对每个类的字节码2.1jMonitor事件类型每个jMonitor事件模式至少基于以下基本Java语言抽象之一:类中字段的读取或写入、方法调用、异常的方法返回或抛出,或新对象或数组的创建。监控应用层构建184M. Freeman / Electronic Notes in Theoretical Computer Science 113(2005)181-200图二. jMonitor类加载器执行实时字节码插装通过在setEventPatterns方法中调用jMonitor.EventPattern方法,表1总结了jMonitor支持的不同类型的Java事件和相应的jMonitor.EventPattern静态方法。2.2活动背景表1中列出的每个jMonitor方法都返回对新构造的jMonitor.EventPattern对象的引用每个创建的EventPattern对象可以使用它支持的一个或多个上下文定义API(如表2所列)进一步修改,以缩小它匹配的事件上下文例如,下面的代码片段:M. Freeman / Electronic Notes in Theoretical Computer Science 113(2005)181185事件类型EventPattern方法参数事件描述字段读取onFieldRead 无直接或通过对象或静态类引用Field writeonFieldWriteNone为字段赋值,直接或通过对象或静态类引用通过对象调用方法引用或直接在同一范围内或作为静态方法ReturnonReturn无返回指令的发出从方法上下文Throw异常onThrowNone从方法上下文在New上创建实例None发出使用的新指令实例化一个具体类数组创建onArrayCreateNone发出用于创建一个新数组任何事件onAnyEvent无此列表中列出的任何事件表表1事件类型EventPattern方法参数类型参数描述方法、字段、类或异常签名要匹配事件目标签名的正则表达式从方法签名正则表达式匹配立即导致事件的方法的签名in方法签名正则表达式匹配运行时调用堆栈中的任何方法setNameString模式的名称getNamenone表2.EventPattern上下文定义方法...static void setEventPatterns(){EventPattern e1,e2,e3;e1=jMonitor.EventPattern.onFieldWrite().of(“\\.Foo.a$”); e2 = e1.from(“\\.MyApp\\.bar\\(“);e3=jMonitor.EventPattern.onMethodCall().of(“\\.Foo\\.m\\(“).from(“Bar\\..*\\(“);...}定义一个新的事件模式e1,对应于所有对186M. Freeman / Electronic Notes in Theoretical Computer Science 113(2005)181-200\\\\\EventPattern方法参数描述和EventPattern对象或EventPattern对象返回新的事件模式,该模式必须与目标事件模式和参数事件模式返回与目标或参数事件模式返回与所有其他事件模式匹配的新事件模式与参数事件模式不匹配的事件表3 EventPattern逻辑运算符在所有Foo类中命名为第二个事件模式e2是从e1派生的,但进一步限制了新的事件模式,仅当在执行MyApp.bar函数调用期间发生对Foo.a字段的写访问事件模式e2匹配由e1描述的所有事件的子集类似地,每个EventPattern上下文定义方法调用都会构建一个带有附加约束的新事件模式事件模式e3匹配从包或类Bar中的任何地方放置的所有Foo.m()方法调用。2.3正则表达式的符号表示在阅读代码示例时必须注意的是,在POSIX和Perl正则表达式中,符号用于匹配任何单个字符。由于Java包名使用这个字符,为了显式匹配一个 包 名 ( 如 java.lang ) , 并 防 止 匹 配 可 能 匹 配 的 其 他 名 称 ( 如javaSlang)。必须转义到正则表达式引擎。这是用““字符完成的。不幸的是,因此,当序列“。” is seen in one of jMonitor’s match expressions itshould be read as “match a single period here” as2.4组合事件模式新的事件模式可以使用表3中定义的逻辑运算符来构造。例如,下面的代码片段:jMonitor.EventPattern e1,e2,e3,e4;e1=jMonitor.EventPattern.onFieldRead().of(“\\.Foo\\.a$”); e2=jMonitor.EventPattern.onFieldWrite().of(“\\.Foo\\.a$”); e3 = e1.or(e2);e4 = e1.and(jMonitor.EventPattern.onAnyEvent(). 从(“[\\. ]栏\\..*\\(“).not());定义一个新的事件模式e1,匹配所有M. Freeman / Electronic Notes in Theoretical Computer Science 113(2005)181187在所有Foo类中命名为“a”,在任何包中。第二个事件模式e2本质上与定义为“写”的模式相同。因此,e3匹配任何包中所有Foo类中名为“a”的字段的“读”或“写”。最后,e4被定义为匹配所有Foo类中名为“a”的字段的所有2.5将附件附加到事件创建事件模式对象本身并不一定会导致任何应用程序类字节码的插装以设置监视器调用触发器。只有通过将事件模式与事件监视器相关联,jMonitor才能检测匹配上下文通过调用事件模式的doBefore、doAfter或doInstead方法之一来建立此关联在加载任何应用程序类之前,在初始化期间静态地执行事件模式与被监视应用程序的类字节码中的实际指令当执行到达指定的事件触发器位置时,插装的应用程序方法对于使用of和from构造构建的事件模式,不需要额外的运行时检查来确定特定的Java指令是否包含上下文定义的事件模式在应用程序执行期间会产生非常轻微的额外运行时开销(单个布尔测试),这些开销围绕着可能与事件模式匹配的每条指令这也给in构造所提到的函数调用带来了类似的开销要将事件监视器附加到特定的事件模式,只需调用表4中列出的setEventPatterns方法之一。图3中展示了一个示例事件指定器类。此示例 指 定 了 一 个 事 件 模 式 , 该 模 式 将 所 有 对 mypackage.MyClass.foo(Object)函数的调用替换为mypackage.MyNullMonitor类的doInstead方法。可以多次调用每个方法,以附加在事件触发时调用的其他监视器方法。public class MyEvents{public void onDestinyNode(){jMonitor.EventPattern.onMethodCall().of(“int mypackage\\.MyClass\\.foo\\(Object\\)”).doInstead(“mypackage\\.MyNullMonitor”);}}图三.事件模式规范示例188M. Freeman / Electronic Notes in Theoretical Computer Science 113(2005)181-200P jMonitor P:Package|C:类|CEventTypeI:接口| |M int getType()S: Static Method| |M String toString()A: Abstract|M:方法|CEventContext| |M EventTypegetEventType()| |M String getSignature()| |M Object getTarget()||M ObjectgetValue()||M Object[]getArguments()| |M StackFrame[] getCallStack()||M EventPatterngetEventPattern()| |Object passThrough()| |M Object passThrough(Object[])||我监控| |M voiddoEvent(EventContext)||IInsteadMonitor| |M Object doInstead(EventContext)||CStackFrame| |M String getSignature()||M Object[]getArguments()||M StringgetSourceFile()| |M Integer getSourceLine()||CEventPattern|System.out.println()|System.out.println()|S EventPatternonMethodCall()|System.out.println()|System.out.println()|S EventPatternonNew()|System.out.println()|System.out.println()||MEventPattern of(String)|MEventPattern from(String)|MEventPattern in(String)||MEventPattern(事件模式)|MEventPattern或(EventPattern)|MEventPattern not(EventPattern)||StringgetName(String)|StringgetName()||String s(String s)|String s (String s)|MString s(String s)见图4。jMonitor类层次结构和概述M. Freeman / Electronic Notes in Theoretical Computer Science 113(2005)181189EventPattern参数描述方法doBefore类名称参数包含类名包含一个doEvent监视器方法,该方法使用调用上下文信息进行在指定的匹配Java事件发生之前doAfter类名称参数包含类名包含一个doEvent监视器方法,该方法通过调用上下文信息进行调用。在指定的匹配Java事件发生后立即执行。不适用于返回和抛出事件。doInstead类名称参数包含类的名称包含doInstead监视器方法其利用呼叫上下文信息被呼叫。调用此方法而不是指定的匹配Java 事件。从doInstead监视器返回的值表4EventPattern监视器指定方法.3事件监视器每个事件模式都与零个或多个事件监视器相关联jMonitor事件监视器是一 个 纯 Java 类 , 继 承 自 jMonitor 包 中 的 一 个 抽 象 类 : Monitor 或InsteadMonitor。 每个类对应于附加到事件模式的监视器的特定类型。doAfter和doBefore监视器实现jMonitor.Monitor接口和抽象doEvent方法。doBefore和doAfter监视器旨在作为观察者监视器,尽管监视器是作为无约束的Java方法实现的,并且可以有副作用。另一方面,doInstead类型的监视器旨在允许对所监视的事件进行用户级行为替换这些监视器实现了jMonitor.InsteadMonitor接口和抽象的doInstead方法。doInstead方法返回的Object结果用于jMonitor插装的事件行为替换逻辑。的190M. Freeman / Electronic Notes in Theoretical Computer Science 113(2005)181-200包含事件监视器方法的类在运行时传递给jMonitor,指定为命令行参数或放置在类路径中jMonitor通过调用doBefore、doAfter或doInstead方法,基于附加到事件的所有事件监视器,在任何加载的类中检测每个与指定事件模式之一匹配的Java指令如果多个监视器方法被附加到同一事件模式,他们所称的,并不一定是真的。检测的应用程序将请求的调用上下文信息打包,并以调用上下文作为参数调用附加的监视器方法。表5描述了包含可由monitor方法通过其jMonitor.EventContext参数访问的上下文的信息。图5展示了一个相当通用的监视器,用于记录事件跟踪以及所有可用的上下文信息。EventContext方法返回类型描述getEventType jMonitor. jMonitor事件的EventType类型,该类型包含-定时监视呼叫getSignatureString匹配“of”约束的目标的签名。getTarget Object事件对应的目标对象getValue Object获取返回的结果或异常或将要写入getArgumentsObject[]提 供 给 目 标 事 件 的 参 数 。getArgu-ments()[0]保存值对于任何getCallStackjMonitor.StackFrame[]获取与运行时Java调用堆栈对应的堆栈帧数组。堆栈帧是一个对象,包含:方法的签名、传递给方法的参数(如果可用)、源代码文件、此方法的调用行(如果可用)getEventPatternjMonitor.EventPattern获取与当前事件表5jMonitor事件上下文接口.3.1行为调整使用替代方法当应用程序到达对应于与instead监视器关联的jMonitor事件的Java字节码指令时,M. Freeman / Electronic Notes in Theoretical Computer Science 113(2005)181191Java指令时,将调用监视器从doInstead监视器返回的值随后在适当的地方插入,以用插装的字节码替换相应的Java事件每个doInstead监视器都实现了jMonitor.InsteadMonitor接口,并且可以使用传递给监视器的jMonitor.EventContext的passThrough方法来执行被替换的原始事件。passThrough方法接受一个Object[],表示每个事件类型的参数:• 字段读取:无args• field write:arguments[0]被写入• 方法调用:从调用上下文中使用可能修改的参数[]调用• 返回:can’t call• 抛出异常:• 新对象或数组:构造函数用来自调用上下文的参数[]StackFrame方法返回类型描述getSignature String当不为null时,调用堆栈.getArgumentsObject[]不为null时,提供给堆栈框架的方法。getSourceFile String当不为null时,栈帧getSourceLine在源文件中的行号栈帧表6StackFrame信息也可以在不带参数的情况下调用passThrough方法,以采用最初传递给受监视事件的相同参数。passThrough调用强制执行否则将被替换的事件,并返回结果对象(如果合适)。相反,- Monitor可以随后选择返回自己的计算结果或从passThrough调用获得的无论doInstead监视器的值是多少,192M. Freeman / Electronic Notes in Theoretical Computer Science 113(2005)181-200public class MyNode { public void MyNode(MyNodecontext){System.out.println(“Event:“+context.getEventType().toString()+“of“+context.getSignature());System.out.println(“模式名称:“+context.getPattern().getName());System.out.println(“Target =“+ context.getTarget());System.out.println(“Value =“+context.getValue());Object[] args= context.getArguments();if(args!=空值){for(int a = 0; a!=args.length;++a){System.out.println(“Arg #”+ a +“:“+args[a]);}}jMonitor.StackFrame[]堆叠return.getCallStack();if(stack!System.out.println(“调用堆栈“);for(int i =0;i!stack.length; ++i){ jMonitor.StackFrame frame=stack[i];System.out.println(““+frame.getSignature());Object[] args= frame.getArguments();if(args!=空值){for(int a = 0; a!=args.length;++a){System.out.println(“Arg #”+ a +“:“+args[a]);}}Stringfile = frame.getSourceFile();if(file!=空值){System.out.print(“at:“+file);intline=frame.getSourceLine();if(line!= 空值)System.out. println(“[”+line+“]”);System.out.println();}{\fnSimHei\bord1\shad1\pos(200,288)图五. 示例监视器:TraceMonitorturn用于替换被监视的原始事件的行为。图6显示了一个替代监视器的示例。4设计和实施概述为了在遗留Java应用程序执行期间监视运行时事件,开发人员必须使用jMonitor应用程序启动器启动目标应用程序。在命令行中启动监视会话必须提供的唯一附加信息是事件规范类的列表。事件监视器类的名称会显式传递M. Freeman / Electronic Notes in Theoretical Computer Science 113(2005)181193包mypackage;public class MyNullMonitor实现jMonitor.InsteadMonitor {publicObject doInstead(jMonitor.EventContext context){int [] nums = nums. getString();如果(参数长度!= 0args[0]==null){ return newargs(10);}否则{return context.passThrough();}}}见图6。InsteadMonitor示例:MyNullMonitor因为当引用监视器方法的插装应用程序类被加载时,它们将由JVM按需动态加载。在其启动初始化期间,jMonitor检测类加载器调用用户提供的事件 模 式 规 范 类 的 静 态 setEventPatternssetEventPatterns 方 法 中 的jMonitor.EventPattern方法调用构建监视器事件模式。然后,使用事件模式上的doBefore、doAfter或doInstead方法之一来将事件模式与用户指定的事件监视器相关联由用户指定并附加到监视器的每个事件模式随后引导jMonitor类加载器在加载每个类之前执行每个类的字节码的任何必要的on-the-y插装下面的伪代码演示了jMonitor类加载器使用的插装逻辑。对于每个加载的类,c对于每种方法,m,在c对于每个指令,i,以c.m对于每个用户指定的事件模式,ep如果i.匹配(ep,m,c)如果i.monitors不为空,则将ep.monitors添加到i.monitors如果i.beforeigns不为空,则插入上下文提取存根插入doBefore调用如果I.INSTEADIVE为空,则插入指令I其他插入doInstead调用194M. Freeman / Electronic Notes in Theoretical Computer Science 113(2005)181-200\\插塞代替返回如果i. aftertime不为空,则插入doAfter调用else//i没有监视器插入指令i4.1现状和局限性已经实现了用于概念验证的jMonitor的原型实现。当前的实现使用BCEL字节码工程库[2]和Apache Perl 5风格的正则表达式库。一个开放源码的实现,以实现完整的jMonitor功能的计划。对用户施加的一个限制是,事件监视类必须与事件指定类不同(或在指定类中声明为内部类)。这对于防止动态类在加载事件规范类之前尝试加载监视器或遗留应用程序类jMonitor需要首先加载指定类,并在加载任何其他类之前了解所有用户定义的事件模式,否则插装将是部分的。4.2性能在加载任何应用程序类之前,在初始化期间静态地执行事件模式与需要被检测的被监视应用程序的类字节码中的实际引入的匹配。没有与事件模式匹配相关的广告运行时开销,这些事件模式匹配涉及使用of和from构造构建的事件模式。当执行到达指定的事件触发器位置时,插装的应用程序方法只需调用事件监视器方法。然而,包括上下文定义的事件模式在应用程序执行期间围绕可能匹配事件模式的每个指令产生非常轻微的额外运行时开销(单个布尔测试)。但是,需要注意的是,匹配in模式没有运行时正则所有正则表达式都在检测时匹配。为了说明该机制,假设有一个in(“^int .*(“)模式,以匹配任何返回int的函数。对于这个模式对象,jMonitor引入了一个特定于线程的静态boolean(因此每个in()模式每个线程都有一个boolean)。当检测一个方法时,jMonitor会检查它是否与任何事件的所有模式匹配。如果匹配,则插装在方法周围添加一些代码,M. Freeman / Electronic Notes in Theoretical Computer Science 113(2005)181195添加一个局部布尔变量。 如果当前线程的这个模式的布尔值为false,那么这个布尔值被设置为true。 如果不是,那么我们将局部布尔值设置为false,并将模式布尔值保留为true。然后,将finally子句添加到该函数中,以检查局部布尔值是否为真(即,此调用是将模式的布尔值设置为true的调用),则插装将模式的布尔值设置为false。随后,每当jMonitor检测一条指令时,如果该指令的事件模式包含一个in约束,它就会检查当前线程的每个in模式的布尔值,以查看它是否设置为true。 因此,我们可以避免做任何运行时正则表达式匹配可以支持的约束,而不会有太多的运行时开销。5相关工作5.1面向方面编程jMonitor促进了一个编程模型,该模型似乎与面向方面然而,存在若干分歧。面向方面编程所表达的范型是一种开发范型。它改变了人们设计和实现软件的方式。相比之下,jMonitor实现的运行时监控的概念是在事后才提出来的。当一个人完成了他们的应用程序,并试图更多地了解为什么一个特定的行为正在发生,她可能会决定附加监视器到各种事件,为此目的。所有的插装都是在运行时完成的,通过使用监视类加载器,这些监视器可能只用于应用程序的一个子集我们设想调试环境可以围绕该技术开发,而不是开发环境。虽然监控的实现可能与面向方面的编程有一些相似之处,但用例以及编程方法 它提出的,是不同的。5.2Java-MaC与jMonitor最相似的工具是Java-MaC,它是监视和检查架构的Java实现[4]。Java-MaC支持以Java表达式的形式在Java程序上指定事件和警报的语言,该表达式以静态对象开始。这些事件可以检测系统中对象字段的更改以及方法调用的开始和结束。支持各种其他上下文来限制此类事件的范围。196M. Freeman / Electronic Notes in Theoretical Computer Science 113(2005)181-200Java-MaC具有的一个特性使它对特定类型的 它跟踪对特定对象的引用。这允许它确定特定对象的字段(由来自某个静态类对象的代码路径确定)已被更改,而不仅仅是特定类型的对象的字段被更改。然而,此功能会导致Java-MaC产生性能损失Java-MaC缺少一些JMonitorjMonitor还能够根据字符串正则表达式匹配的名称和类型来监控字段修改或写入字段。由于这些差异,我们发现JMonitor是一个比Java-MaC更低级别的工具,并且有兴趣了解如何使用JMonitor直接在Java中实现Java-MaC等工具,而不必直接深入研究复杂的5.3Valgrind另一个在性质和设计上类似的项目是Valgrind [5]。Valgrind是一个对已编译的x86代码进行插装的框架。使用Valgrind实现的一些工具是内存泄漏和溢出检测器,以及profilers。然而,Valgrind有相当大的运行时性能成本,因为即使不执行插装,也会有大约四到五倍 该工具的其他一些限制是由于其目标域的限制:编译x86代码的环境。在编译的x86二进制文件中没有足够的Meta信息来设计Valgrind中的通用运行时检测皮肤,因为大多数有用的在Java中实现的jMonitor可以访问关于任何特定指令实际访问哪些函数或字段像 Valgrind 这 样的 工具 和 其他 商业 上 成功 的二 进 制工 具包 , 如Rational的Purify和Quantify和Code coverage工具,或Boundslogan,确实为软件开发人员在监视和检测动态内存访问和使用违规,pro-gramprofiling和代码覆盖方面提供了非常有价值的jMonitor o从根本上提供了为Java应用程序开发开发这些类型的工具所需的一切支持。5.4jContractor在设计和实现方法上与jMoni- tor最相似的系统是jContractor[1],它是一个基于纯Java库的Design ByM. Freeman / Electronic Notes in Theoretical Computer Science 113(2005)181197Java语言的合约它是一个开源项目,目前托管在www.example.com上http://jcontractor.sourceforge.net/。jContractor的设计是Karlman博士学位的一部分。论文,设计纯库和基于反射的技术来扩展面向对象语言[9]。jContractor 合 约 被 编 写 为 遵 循 简 单 命 名 约 定 的 Java 方 法 。jContractor通过instrumenting定义合约的类的字节码来提供运行时合约检查。jContractor可以将合约检查代码添加到类文件中,以便稍后执行,或者可以在加载时在运行时检测类jContractor和jMonitor都是纯粹基于库的,不需要对JVM进行预处理或修改jContractor通过允许合约方法使用无约束的Java表达式来提供一些有限的运行时监控功能前、后条件和不变方法只能在函数入口和出口点用于监视目的,而不能控制或访问其调用上下文。jMonitor是一种更细粒度,更低级别和更轻的仪器方法,非常适合事件指定和监视。5.5二进制组件适配另一个与jMonitor有一些相似之处的项目是基于Java字节码加载时间修改的二进制组件自适应(BCA)机制[6]。二进制组件自适应(BCA)允许组件以二进制形式进行自适应和演化,并在程序加载期间进行。与jMonitor类似,BCA在加载组件二进制文件之前(或加载时)重写组件二进制文件,并且不需要访问源代码。这种方法非常灵活,允许广泛的修改(包括方法添加,重命名和继承或子类型层次结构的更改)。jMonitor和BCA之间的差异主要是由于应用程序域。BCA旨在转换组件或应用程序,以适应不断变化的接口和其他设计更改。 这些调整是规定的,以delta规范的形式,例如添加或重命名方法或字段,扩展接口,以及更改继承或子类型层次结构。jMonitor可以支持其中一些更改,例如不需要修改继承层次结构的更改。 另一方面,BCA不支持检测和监视jMonitor提供的低级Java事件类型。198M. Freeman / Electronic Notes in Theoretical Computer Science 113(2005)181-2005.6基于查询的查询Lencevicius等人 [7]开发了一个基于查询的调试工具,它的工作方式有点类似于SQL数据库查询工具,查找满足给定布尔约束表达式的所有对象元组。基于动态查询的调试器在程序运行时不断更新查询结果为了提供此功能,调试器查找被调试程序更改可能影响查询结果的字段的所有位置,并使用复杂的算法来增量地重新评估查询。on-the-docky调试器增加了一个功能,可以在指定的执行阶段停止java程序,并启用查询以及允许稍后更改查询。他们已经实现了这样一个基于查询的动态调试器,用于纯Java编写的Java,没有JVM修改。似乎可以使用基于jMonitor的工具来帮助类似类型的调试场景。jMonitor监视器可以由程序员编写,通过在调试程序运行时连续检查对象间的关系来提供即时错误警报。监视器可以在程序运行时不断更新查询结果(表示为用户级Java表达式),并且可以在查询结果发生变化时立即停止程序。程序员可以指定匹配所有上下文的事件模式,其中被调试程序更改字段,该字段可以检查查询结果的效率。6结论我们已经介绍了jMonitor,一个纯Java库和运行时实用程序,用于事件模式的用户级指定,并将它们与用户定义的事件监视器相关联。jMonitor类加载器无缝地检测应用程序类,以便在执行期间发生错误的Java运行时事件时调用指定的监视器函数。jMonitor的主要优点之一是易用性和直观性它对事件建模和监测的方法。该方法是轻量级的,非侵入式的典型编程和软件开发过程。支持正则表达式是非常强大的,并且在设计事件模式时会导致非常简洁和简单的用法。jMonitor不需要特殊的编译器,预处理器或特殊的IDE,因为它不需要源代码或强制重新编译,所以它很好地支持遗留应用程序。jMonitor提供了一个灵活、强大、实用且直观的事件建模和监视范例,M. Freeman / Electronic Notes in Theoretical Computer Science 113(2005)181199面向方面编程的相同好处,但不需要对大多数Java程序员设计和实现软件的方式进行重大更改,同时支持他们的遗留开发工具和实践。jMoni
下载后可阅读完整内容,剩余1页未读,立即下载
cpongm
- 粉丝: 4
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- zigbee-cluster-library-specification
- JSBSim Reference Manual
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功