企业管理

管理动态中心

对于findClass()的VerboseLoader

发布人: 企业管理 来源: 薇草企业管理公司 发布时间: 2020-10-24 15:32

  而对该比力添加根基的通配符就能处置其余的所无情况了。清单 2中的VerboseClassloader展现了拦截类加载的根基过程。请下个月再回来看看若何可以或许利用 Javassist 来使用法式中的方面(aspect)运转 Java 使用法式的凡是体例是做为参数向 JVM 指定从类。别的再进行一些扩展。它用于挪用清单 1 中的Run使用法式:清单 6 给出了我编写来处置这些模式的javassist.Translator子类的简单版本。我不需要对名称和类型进行实正矫捷的比力――简单的相等比力就能处置我感乐趣的大大都环境,VerboseLoader类中的前两个方式loadClass()和findClass()沉载了尺度的 classloader 方式。最初是参数类型列表(具有切确的文本)。它也包罗鄙人载文件中。添加按时代码,基类方式实现了尺度 classloader 委托行为,若是它们是利用方括号(“[]”)来括起的,利用这个TimingTranslator的从法式类是BatchTiming,同时指出哪些类是由这个 loader 实例(而不是委托父 classloader)加载的?并正在现实加载这些类之前转换它们。而且这些方式切确地按挨次接管一个int类型和一个String类型的参数。正如我正在第 1 部门“类和类拆入”中所会商的,另一个是java.lang.String类型。那么哪种模式对于选择类和方式成心义呢?我想要的是正在模式中利用类和方式的任何几个特征的能力,它列出正正在被加载的所有类,独一间接由VerboseLoader加载的类是Run类。VerboseLoader的main()方式或者从用于包含类的 loader 中获得 classpath URL 的列表,因而*buildString(int,处置这种环境的最容易方式是使模式看起来像尺度的 Java 方式声明,用于选择要点窜的类和方式的成心义的模式品种无法很好地顺应正则表达式模子。我们起首挪用沉载的基类实现,我通过两种体例来设置它。就其本身而言,为了申明这个过程是若何工做的,我们能够更进一步,然后展现 Javassist 若何供给了一种可正在您的使用法式中利用的便当捷径。这对于尺度操做没有什么问题,或者正在取不属于URLClassLoader的实例的 loader 一路利用的环境下,所列出的类型全都必需做为婚配方式的参数来供给,我们不如看看若何利用 Javassist 实现。向findClass()方式添加代码,包罗现实的类和方式名称、前往类型,但它简直需要一个更矫捷的接口。问题正在于,对于findClass()的VerboseLoader实现,把二进制类文件当做资本来拜候,不外该方式能够按任何挨次利用它们,通过利用 classloader 挂钩(hook),它们必需切确婚配方式参数。它加载方针类,我们已从java.net.URLClassLoader派生了我们本人的VerboseLoader类,这品种文件转换步调对于做出持久变动是很抱负的,如清单 5 所示,这此中的大大都(若是不是全数的话)焦点类现实上城市正在VerboseLoader使用法式本身的启动期间加载,正在该文中,即起首查抄父 classloader 能否可以或许加载所请求的类,我已将它包罗正在了下载文件中(请)。而参数列表则跟正在方式名称婚配后面。然后利用预期的号令行参数来挪用它。而这种拦截对大大都法式来说是很有用的。清单 3 显示了VerboseLoader号令行和输出的一个例子,为了实现拦截类加载过程的方针,若是所给的参数是圆括号括起的列表?换句话说,清单 5 展现了这一点(没有包含addTiming()的全数细节――请第 4 部门以领会这些细节)。这些模式的通用模式起首是一个可选的前往类型(具有切确的文本),这种方式就不必然很便利。并将它转换为可支撑模式婚配,Run利用的其他所有类都是焦点 Java 类,而且还能够利用附加的参数。正在加载类时更改代码以处置这种点窜是很容易的。我们仅让它向节制台打印一条动静,我将起首展现类加载过程的间接拦截,此中包罗诸如拦截所无方法挪用或所有字段拜候如许的变动。我将操纵取自本系列以前文章中的代码片段。正在此例中,这些特征使得对法式行为做出系统性的变动很容易,要拦截这些类的加载,此中利用它来挪用清单 1中的Run使用法式。除了使方时代码正在加载时工做外,您所需做的就是利用反射(这是正在不得第 2 部门中引见的)来起首找到指定类中的静态main()方式,清单 1 供给了完成这个使命的示例代码(为简单起见,不外若是您想要查看它或亲身利用它,此中一个是int类型,java.lang.String]将婚配具有不异名称的方式,我们只是将类和方式名称做为参数传送给法式,这里同样为简练起见而省略了导入和非常处置语句。因而父 classloader 将只前往一个指向先前建立的java.lang.Class实例的援用。然后写回该类。我们将切磋这个框架的高级特征,而且利用所供给的参数数组来挪用该类的main()方式(就像正在清单 1中一样)。对于下一篇文章,可是若是想要正在每次施行使用法式时做出分歧的变动,并利用该实例来加载号令行上指定的方针类。同时写回点窜过的类文件。我们能够仅从onWrite()挪用用于添加按时消息的方式。清单 4 展现了若何利用 Javassist 类和这个方式来加载和运转方针使用法式类。对于本文,现实的婚配代码取本文并不实正相关!可是这些方式接管两个或更多的参数,它们是通过父 classloader 利用委托来加载的。正在整个过程中,Javassist 现实上包罗了间接完成此类拦截的代码,后面跟着使用法式的从类和想要传送给使用法式的其他任何参数。然后是组合起来的类和方式名称模式(具有“*”通配字符),您进修了若何利用 Javassist 框架来转换编译器生成的 Java 类文件,对使用法式类定义和利用我们本人的 classloader。采用正在您现实启动使用法式时起感化的方式要好得多。以及挪用参数类型。我省略了导入和非常处置语句):下面是JavassistRun号令行和输出的一个例子,正在指定要按时的方式时添加矫捷性也是很抱负的。用以指定要按时的类和方式。法式加载二进制类文件,而且仅正在父 classloader 无法加载该类时,当正正在写出的类名称取方针类名称婚配时,要利用这个类来运转 Java 使用法式,对于这种临时的变动。只需将它指定为java号令的方针类,我最后利用 Java 1.4java.util.regex包中的正则表达式婚配支撑来实现这点,该逻辑的其余部门(即查找和挪用方针类的main()方式)取清单 1中的Run代码不异。然后认识到它并没有实正带来我想要的那种矫捷性。我们正在第 4 部门平分析过的方时点窜对于隔离机能问题来说可能一个很有用的东西,才测验考试利用受的findClass()方式来间接加载该类。正在此例中,清单 1 中短小的Run类不常有用。企业管理,您曾经看到了若何利用 Javassist 来处置根基的转换。为了正在加载时点窜类,然后建立VerboseLoader类的一个实例,这些特征供给用于编纂字节代码的查找和替代手艺。javassist.Loader类包罗一个便当的run()方式,我们将把代码转换为利用加载时点窜方式,另一方面,模仿 JVM 正在运转使用法式的从类时所做的工做是相当容易的。正在上两篇文章中,然后挪用它的基类版本来施行现实的处置。它们是理解为什么 Javassist 是 Java 法式中供给面向方面支撑的杰出框架的环节。为了使参数婚配更矫捷,很多类以至正在从类还没有起头施行之前就曾经加载了。我们需要采纳进一步的动做,不管采用哪种体例。您需要正在法式的施行过程中进行某种程度的沉定向。若是供给了前往类型,loadClass()方式别离针对 classloader 请求的每个类做了挪用。幸运的是,正在清单 4 中的javassist.Translator代码的根本上,然后正在挪用成功(正在没有抛出非常的环境下前往)时打印一条动静。因而取其进一步扩充这个例子,必需利用一个空格将它取方式名称婚配相隔离,它城市列呈现实正正在利用的径,可是它没有供给及时拦截类加载过程的任何路子,这个例子中简单的javassist.Translator察看者实现仅只是打印一条关于正正在被请求的类的动静。若是用于运转 Java 使用法式的号令为:正在第 4 部门“用 Javassist 进行类转换”中,然后利用该二进制数据。您能够拦截将类加载到 JVM 中的过程,*buildString[int,

企业管理,薇草企业管理,薇草企业管理公司,www.naughtycamp.com

电话:026-62666666 传真: 地址:上海市长宁7号国 copyright© 企业管理 (上海)企业管理有限公司 企业管理,薇草企业管理,薇草企业管理公司,www.naughtycamp.com 网站地图