昨天无意间发现一个Android与IOS的自动化测试工具MonkeyTalk,觉着很有意思就去看了一下,看文档时又见AspectJ。一个东西重复几次出现在面前,那就有必要研究一下了。看了一些AspectJ的一些介绍后,脑子里突然间就闪现出C#中的扩展方法,或许由于对多种语言都稍微了解一点吧,看到某个语言有个有意思的语法或者特性,不由自主就会想到其他语言做对比,就像刚接触java里注解立刻想到C#里特性,或者前一段时间看到JavaScript里var DYUI = DYUI || {};这样的代码,就想到了C#里partial类的概念一样。一般这种时候都会感慨语言之间相互偷师,以及现在语言发展趋同性严重。但仍回过头来仔细想想,这些语言相互偷师的时候,其根据自身语言特点实现到底有哪些不同。
那么C#中扩展方法和Java AspectJ实现机制有哪些不同呢?
他们共同点:
都是对已有类中方法进行扩展,破坏了面向对象编程中的封装性
都在编译器层面做了些许动作或者叫编译器欺骗,以保持面向对象语言语法上的完整性
据我所知C#中扩展方法并没有对被被扩展类进行破坏,其编译出来的结果扩展类里方法并没有真正被嵌入到被扩展类文件中,我推测AspectJ在这点和扩展方法应该一样(这点正是我要请教的地方,是否一样呢?)
不同点
其语法差异很大,虽然都破坏了封装性,但C#的扩展方法至少在语法上与其他类方法保持一致,但AspectJ完全定义了另一种针对其编译器的语言
疑问点
C#扩展方法和AspectJ到底还有那些不同?
哪种方法对于扩展来说功能更加强大呢(虽然AspectJ较扩展方法各种概念定义的很完善,但没有看出来它比扩展方法功能上强悍的地方,是否真是这样呢)?
最后针对Android自动化测试这一块总结一句,Android自动化测试框架中有使用反射捕获控件的(Robotium,这也就是为什么跨不了进程的原因),有基于Accessibility机制捕获控件的(原生测试框架UiAutomator),有类似于MonkeyTalk这种基于代码注入捕获控件的(我推想MonkeyTalk的实现机制是用AspectJ注入到源码各种控件方法中监控用户输入,然后录制生成javascript的代码,回放时javascript代码生成的事件通过其MonkeyTalk Agent解释成用户消息驱动回放动作),那么针对控件捕获这一块还有没有其他的实现思路呢?
如果有大牛看到这篇帖子,敬请赐教,针对于以上任何问题提供解惑思路都感激不尽。