构建javaagent,而不是使用框架-java开发java经验技巧

构建javaagent,而不是使用框架-java开发java经验技巧

ID:30847931

大小:58.50 KB

页数:6页

时间:2019-01-03

构建javaagent,而不是使用框架-java开发java经验技巧_第1页
构建javaagent,而不是使用框架-java开发java经验技巧_第2页
构建javaagent,而不是使用框架-java开发java经验技巧_第3页
构建javaagent,而不是使用框架-java开发java经验技巧_第4页
构建javaagent,而不是使用框架-java开发java经验技巧_第5页
资源描述:

《构建javaagent,而不是使用框架-java开发java经验技巧》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、构建JavaAgent,而不是使用框架-编程开发技术构建JavaAgent,而不是使用框架木文由ImportNew・黄小非翻译自javacodegeekso欢迎加入翻译小组。转载请见文末要求。Javaannotations自从被引入到Java之后,一直扮演着整合各种API的作用,尤其是对大型应用框架而言。在这方面,Spring和Ilibcrneitc都是Javaannotation应用的好例子仅仅需要增加几行简单的Javaannotation代码,就可以实现非常复杂的程序逻辑。尽管对这些API(的写法)存在一些争论,但是大多数程序员认为,只要使用得当,这种声明式编程在形式上

2、还是很有表达能力的。不过,只冇少量程序员基于Javaannotation编写框架API,或者应用程序中间件。Z所以造成这种现象很主要的一个原因是,程序员们认为匕阳annotation会降低代码的可读性。在本文屮,我就想告诉大家,实现这些基于annotation的API其实并不是完全无用的,只要使用恰当的工具,其实你也并不需要了解太多Java内部函数的知识。在实现基于annotation的API时,很明显的一个问题就是:这些API在Java运行时是不会被JVM处理的。这样造成的结果就是,你没法给一个用户annotation赋予一个具体的含义。例如:如果我们定义了一个@Loga

3、nnotation,然后我们期望在标注Y@Log的地方,每调用一次就形成一条日志记录。classService{@LogvoiddoSomcthing(){//dosomething・・・}}单靠标注本身写在哪里,是不口J能完成执行程序逻辑的任务的,这就需要标注的使用者去发起生成口志的任务。明显,这种工作原理让annotation看上去毫无意义,因为再调用doSomething方法的时候,我们根本无法去观察生成的log里面相应的状态。因此,annotation仅仅是作为一个标记而存在,对程序逻辑来说毫无贡献可言。填坑为了克服上述的功能性局限,很多基于标注的框架都采用了子类覆

4、盖类方法的模式,来赋予特定标注相关的程序逻辑功能。这种方法普遍使用了面向对象的集成机制。对于我们上面提到的@Log标注来说,子类实现机制会产生一个类似于下面的类LoggingService:classLoggingScrviccextendsService{©OverridevoiddoSomething(){Logger.logC^doSomething()wascalled");super.doSomethingO;当然,上面定义这些类的代码通常是不需要程序员手写的,而是在Java运行时,通过诸如cglib或Javasssl这样的库来自动生成。上面提到的两个库都提供了简

5、易的API,叮以用于生成增强型的子类程序。这种把类定义的过程放到运行时的做法,其比较好的一个副作用是,在不特别规定程序规范,也不用修改已有的用户代码的前提下,能够有效实现logging框架的功能。这样就可以避免“显式创建风格”,也就不用新建一个Java源文件去手写代码了。但是,可伸缩性好吗?然而,上面的解决方案又带來了另一个不足。我们通过自动生成子类的方式实现标注的程序逻辑,必须保证在实例化的时候不能使用父类的构造函数。否则调用标注方法的时候,述是无法完成调用添加H志的功能:原因很明显,用父类的构造函数实例化对彖,无法创建出包含子类覆盖方法的正确实例(这是基本的面向对象多态

6、的概念——译者注)。更糟糕的是——当使用上述方法进行运行吋代码生成的时候LoggingService类无法直接被实例化,因为Java编译器在编译的时候,运行时期间生成的类代码还根本就不存在。基于上述原因,Spring或者Hibernate这些框架使用了“对象工厂”的模式。在其框架逻辑的范畴内,不允许直接(通过构造函数)对对彖进行实例化,而是通过工厂类来完成新建对象的工作。这种方式在Spring设计之初就被采纳,用來管理各种beanoHibernates采用了相似的做法,大多数Iliberneites的实例被视为查询的结果对彖,因此也不是显式地来实例化的。然而,有一个特例是,

7、当试图存储一个在数据库屮还不存在的对象实例的时候,Hibernates的使用者需要用Hibernates返冋的对象來替换Z前存储的对象实例。从这个例了來看Hibernates的问题,忽略上述的替换会造成一个普通的初学者错误。除此之外,幸亏有了这些工厂类,才能让子类化的方法对框架用户透明,因为Java的类型系统可以用子类实例来替代其父类。因此,只要是用户需要调用自定义服务的地方,都可以用到LoggingService的实例。很遗憾,这种采用工厂类来创建对彖的方法虽然(在理论上)被证明是可行的,但(在实际中)用来实现我

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。