构建JavaAgent,而不是使用框架Java开发Java经验技巧.docVIP

构建JavaAgent,而不是使用框架Java开发Java经验技巧.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
构建JavaAgent,而不是使用框架Java开发Java经验技巧.doc

构建Java Agent,而不是使用框架-编程开发技术 构建Java Agent,而不是使用框架 木文由ImportNew?黄小非 翻译自javacodegeekso欢迎加入翻译小组。转载请见文末要求。 Java annotations自从被引入到Java之后,一直扮演着整合各种API的作用, 尤其是对大型应用框架而言。在这方面,Spring和Ilibcrneitc都是Java annotation应用的好例子 仅仅需要增加几行简单的Java annotation代码, 就可以实现非常复杂的程序逻辑。尽管对这些API (的写法)存在一些争论,但 是大多数程序员认为,只要使用得当,这种声明式编程在形式上还是很有表达能 力的。不过,只冇少量程序员基于Java annotation 编写框架API,或者应用 程序中间件。Z所以造成这种现象很主要的一个原因是,程序员们认为匕阳 annotation会降低代码的可读性。在本文屮,我就想告诉大家,实现这些基于 annotation的API其实并不是完全无用的,只要使用恰当的工具,其实你也并 不需要了解太多Java内部函数的知识。 在 实现基于annotation的API时,很明显的一个问题就是:这些API在Java 运行时是不会被JVM处理的。这样造成的结果就是,你没法给一个用户 annotation赋予一个具体的含义。例如:如果我们定义了一个@Log annotation, 然后我们期望在标注Y@Log的地方,每调用一次就形成一条日志记录。 class Service { @Log void doSomcthing() { //do something ??? } } 单靠标注本身写在哪里,是不口J能完成执行程序逻辑的任务的,这就需要 标注的使用者去发起生成口志的任务。明显,这种工作原理让annotation看上 去毫无 意义,因为再调用doSomething方法的时候,我们根本无法去观察生成 的log里面相应的状态。因此,annotation仅仅是作为一个标记而存在,对程 序逻辑来说毫无贡献可言。 填坑 为了克服上述的功能性局限,很多基于标注的框架都采用了子类覆盖类方法的模 式,来赋予特定标注相关的程序逻辑功能。这种方法普遍使用了面向对象的集成 机制。对于我们上面提到的@Log标注来说,子类实现机制会产生一个类似于下 面的类 LoggingService: class LoggingScrvicc extends Service { ?Override void doSomething() { Logger. logC^doSomething() was called); super. doSomethingO ; 当然,上面定义这些类的代码通常是不需要程序员手写的,而是在Java运行时, 通过诸如cglib或Javasssl这样的库来自动生成。上面提到的两个库都提供了 简易的API,叮以用于生成增强型的子类程序。这种把类定义的过程放到运行时 的做法,其比较好的一个副作用是,在不特别规定程序规范,也不用修改已有的 用户代码的前提下,能够有效实现logging框架的功能。这样就可以避免“显 式创建风格”,也就不用新建一个Java源文件去手写代码了。 但是,可伸缩性好吗? 然而,上面的解决方案又带來了另一个不足。我们通过自动生成子类的方式实 现标注的程序逻辑,必须保证在实例化的时候不能使用父类的构造函数。否则调 用标注方法的时候,述是无法完成调用添加H志的功能:原因很明显,用父类的 构 造函数实例化对彖,无法创建出包含子类覆盖方法的正确实例(这是基本的 面向对象多态的概念——译者注)。更糟糕的是——当使用上述方法进行运行吋 代码生成的时候 LoggingService类无法直接被实例化,因为Java编译器 在编译的时候,运行时期间生成的类代码还根本就不存在。 基于上述原因,Spring或者Hibernate这些框架使用了 “对象工厂”的模式。 在其框架逻辑的范畴内,不允许直接(通过构造函数)对对彖进行实例化,而是 通过工厂类来完成新建对象的工作。这种方式在Spring设计之初就被采纳,用 來管理各种beano Hibernates采用了相似的做法,大多数Iliberneites的实例被 视为查询的结果对彖,因此也不是显 式地来实例化的。然而,有一个特例是, 当试图存储一个在数据库屮还不存在的对象实例的时候,Hibernates的使用者 需要用Hibernates返冋的对象來替换Z前存储的对象实例。从这个例了來看 Hibernates的问题,忽略上述的替换会造成一个普通的初学者错误。除此之外, 幸亏有了这些工厂 类,才能让子类化的方法对框架用户透明,因为Java的类型 系统可以用子类实例来替

文档评论(0)

ggkkppp + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档