- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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的类型 系统可以用子类实例来替
您可能关注的文档
最近下载
- 急性胰腺炎护理查房课件(完整版).pptx VIP
- 如何做合格的研究生导师.ppt VIP
- GB50084-2001(2005版)自动喷水灭火系统设计规范.docx VIP
- 绿色“垃圾不落地城市更美丽”节能环保树立垃圾分类新观念PPT模板课件.pptx VIP
- 铁路栅栏改移重点项目施工专项方案.doc
- ApacheCN 编程/大数据/数据科学/人工智能学习资源 2019.8.pdf VIP
- 精品解析:北京市八中2023-2024学年九年级上学期期中考试物理试题(解析版).docx VIP
- 大数据互联网科技PPT模板 .pptx VIP
- (人教版)九年级英语第一次月考试卷(含答案).pdf VIP
- 隐球菌性脑膜炎护理.pptx VIP
文档评论(0)