内容简介:下面是我在我们团队上的技术分享内容,从PPT里摘抄出来的,所有很多都是个提纲摘要基于接口编程基于反射调用
2020-01-21
AOP在移动开发中的应用
下面是我在我们团队上的技术分享内容,从PPT里摘抄出来的,所有很多都是个提纲摘要
AOP简介
- AOP,Aspect Oriented Programming,面向切面编程
- 面向切面编程是一种通过横切关注点(Cross-cutting Concerns)分离来增强代码模块性的方法,它能够在不修改业务主体代码的情况下,对它添加额外的行为。
- 是对OOP的一种补充,是一种解耦的重要手段
AOP常用概念
- Join point:程序执行期间的一个点,表示方法的执行
- Pointcut: 切入点实际上也是从所有的连接点(Join point)挑选自己感兴趣的连接点的过程
- Aspect: 程序横向切割成若干的面,即Aspect.每个面被称为切面
- Advice: 某个特定连接点的某个方面采取的行动。不同类型的建议包括“周围(Around)”,“之前(Before)”和“之后(After)”建议
AOP实现原理
-
编译期间的静态织入,又称为编译时增强
-
运行期间的动态代理,又称为运行时增强
运行时AOP
- 程序运行时,依靠预先创建或运行时创建的代理类来完成切面功能。这种方式依赖编程语言的动态能力
- JDK 基于接口的动态代理技术(Spring AOP),基于 Java 反射特性实现
- Objective-C的Method Swizzling和KVO,基于OC的Runtime实现
JDK 基于接口的动态代理技术
基于接口编程
import java.text.MessageFormat; import java.util.Date; interface BookService { void lendOut(String bookId, String userId, Date date); } class BookServiceImpl implements BookService { @Override public void lendOut(String bookId, String userId, Date date) { System.out.println(MessageFormat.format("{0}: The book {1} is lent to {2}.", date, bookId, userId)); } }
基于反射调用
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; class ServiceInvocationHandler implements InvocationHandler { private Object target; public ServiceInvocationHandler(Object target) { this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("Before..."); Object result = method.invoke(this.target, args); System.out.println("After..."); return result; } }
不直接持有子类实例,持有接口实例,真正的实例对象有别人创建
import java.lang.reflect.Proxy; import java.util.Date; public class Client { public static void main(String[] args) throws Exception { BookService bookService = (BookService) Proxy.newProxyInstance( BookService.class.getClassLoader(), new Class[]{ BookService.class }, new ServiceInvocationHandler(new BookServiceImpl()) ); bookService.lendOut("123", "456", new Date()); } }
Objective-C的Method Swizzling
NSThread的start方法扩展
- (void)validStart { @try { if (self.isCancelled || self.isFinished || self.isExecuting) { NSLog(@"should not start"); } else { [self validStart]; //[self start]; } } @catch (NSException *exception) { NSLog(@"exception"); } @finally { NSLog(@"@finally"); }
方法替换来实现AOP(语言本身支持runtime,非常强大的特性)
+ (void)load { [super load]; Class class = [self class]; Method oldMethod = class_getInstanceMethod(class, NSSelectorFromString(@"start")); Method newMethod = class_getInstanceMethod(class, NSSelectorFromString(@"validStart")); method_exchangeImplementations(oldMethod, newMethod); }
编译期AOP
- 编译期就把切面代码和业务代码链接起来,需要编译器或编译 工具 支持
- 有些编程语言编译期生成中间代码的话,较容易支持这种AOP实现
- Java的AspectJ,Flutter的Dart,Android的Gradle插件Transform API
移动端语言对于AOP的支持
- Java:支持运行时AOP和编译时AOP
- Objective-C支持运行时AOP
- kotlin支持编译期AOP(它编译成字节码)
- swift支持运行时AOP(基于Objective-C的特性,局限于OC代码)
- Flutter Dart支持编译期AOP,编译中间产物是dill(修改编译工具)
AOP在移动端应用:无埋点统计
- 传统埋点代码涉及各个模块,有点繁琐又没有太大技术含量
- 无埋点采用AOP实现,解耦代码,且不容易漏统计。业务开发人员只需关注自己的业务代码
Android Gradle 工具在 1.5.0 版本后提供了 Transfrom API, 允许第三方 Plugin 在打包 dex 文件之前的编译过程中操作 .class 文件 遍历所有要编译的class文件并对其中符合条件的方法进行修改,注入我们要调用的SDK数据搜集代码,从而实现自动埋点的目的
参考资料
AOP for Flutter: AspectD(闲鱼团队开源框架)
Category:技术 Tagged:AOP 移动开发
以上所述就是小编给大家介绍的《AOP在移动开发中的应用》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 创建一个促进社区合作的移动应用
- 在出行途中对移动图像应用认知技术
- 移动应用三方 SDK 安全质量保障实践
- 为 Android 开发全栈移动应用
- [译] PWA 会取代原生移动应用吗?
- 用 Vue 写个移动 SPA 应用
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Effective C++
梅耶 (Scott Meyers) / 侯捷 / 电子工业出版社 / 2011-1-1 / 65.00元
《Effective C++:改善程序与设计的55个具体做法(第3版)(中文版)(双色)》内容简介:有人说C++程序员可以分为两类,读过Effective C++的和没读过的。世界项级C++大师scott Meyers成名之作的第三版的确当得起这样的评价。当您读过《Effective C++:改善程序与设计的55个具体做法(第3版)(中文版)(双色)》之后,就获得了迅速提升自己C++功力的一个契机......一起来看看 《Effective C++》 这本书的介绍吧!