欢迎来到天天文库
浏览记录
ID:34526111
大小:476.29 KB
页数:12页
时间:2019-03-07
《java编程的动态性(5)动态转换类》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、中文登录(或注册)技术主题软件下载社区技术讲座搜索developerWorksdeveloperWorks中国Javatechnology文档库Java编程的动态性,第5部分:动态转换类学习如何在使用 Javassist 加载类时修改它们DennisM.Sosnoski(dms@sosnoski.com),总裁,SosnoskiSoftwareSolutions,Inc.发布日期:2004年3月13日级别:初级简介:在经过一段时间的休息之后,DennisSosnoski又回来推出了他的Java 编程的动态性系列的第5部分。您已在前面的文章中看到了如何编写用于
2、转换Java类文件以改变代码行为访问情况:1700次浏览的程序。在本期中,Dennis将展示如何使用Javassist框架,把转换与实际的类加载过程结合评论:0(查看
3、添加评论-登录)起来,用以进行灵活的“即时”面向方面的特性处理。这种方法允许您决定想要在运行时改变的内容,并潜地在每次运行程序时做出不同的修改。在整个过程中,您还将更深入地了解向JVM中平均分(3个评分)加载类的一般问题。为本文评分标记本文!在第4部分“用Javassist进行类转换”中,您学习了如何使用Javassist框架来转换编译器生成的Java类文件,同时写回修改过的类内容文件。这种类
4、文件转换步骤对于做出持久变更是很理想的,但是如果想要在每次执行应用程序时做出不同的变更,这种方法就不一定很方便。对于这种暂时的变更,采用在您实际启动应用程序时起作用的方法要好得多。加载区域运行时定时JVM体系结构为我们提供了这样做的便利途径――通过使用classloader实现。通过使用classloader挂钩(hook),您可以拦截将后续内容类加载到JVM中的过程,并在实际加载这些类之前转换它们。为了说明这个过程是如何工作的,我将首先展示类加载过程的直接拦截,然后展示Javassist如何提供了一种可在您的应用程序中使用的便利捷径。在整个过程中,我将利用
5、取自本系列以前文章中的代参考资料码片断。关于作者建议加载区域不要错过本系列的其余文章第1部分,“类和类装入”(2003年4月)运行Java应用程序的通常方式是作为参数向JVM指定主类。这对于标准操作没有什么问题,但是它没有提供及时拦截类加载过程的任何途标签第2部分,“引入反射”(2003年6月)径,而这种拦截对大多数程序来说是很有用的。正如我在第1部分“类搜索所有标签和类装入”中所讨论的,许多类甚至在主类还没有开始执行之前就已经第3部分,“应用反射”(2003年7月)加载了。要拦截这些类的加载,您需要在程序的执行过程中进行某种程度的重定向。第4部分,“用Ja
6、vassist进行类转换”(2003年9月)热门文章标签
7、幸运的是,模拟JVM在运行应用程序的主类时所做的工作是相当容易我的文章标签openinbrowserPROversionAreyouadeveloper?TryouttheHTMLtoPDFAPIpdfcrowd.com我的文章标签的。您所需做的就是使用反射(这是在不得第2部分中介绍的)来首先找到指定类中的静态main()方法,然后使用预期的命令行参数来调用它。清单1提供了完成这个任务的示例代码(为简单起见,我省略了导入和异常处理语句):更多更少_unassigned125ajaxantapachea
8、pi清单1.Java应用程序运行器best_practic...collectionseclipsegenericgooglehadooppublicclassRun{hibernatei/oibatisj2eepublicstaticvoidmain(String[]args){j2ee_(java_2_...j2seif(args.length>=1){try{j2se_(java_2_...javajava_技术java_入门java-spring//loadthetargetclasstoberunClassclas=Run.class.getCla
9、ssLoader().javascriptjava技术jettyjsfloadClass(args[0]);jsf_(javaserve...jsp_(javaserve...jstljunitjvmjvm_(java_virt...//invoke"main"methodoftargetclassClass[]ptypes=lucenemapreducemavenmvcnewClass[]{args.getClass()};nioscalaservletspringMethodmain=clas.getDeclaredMethod("main",ptype
10、s);sshstrutsstruts2threadS
此文档下载收益归作者所有