Retrofit与Android Room中定义的接口无需手动实现,其实现是在哪里完成的?
这类无需手动编写实现的接口,核心是靠代理类自动生成技术完成逻辑注入,根据库的设计不同,分为运行时动态生成和编译期静态生成两种实现路径:
1. Retrofit 采用JDK运行时动态代理
- 当你调用
Retrofit.create(XXXService.class)方法时,底层直接调用JDK提供的Proxy.newProxyInstance方法,在内存中即时生成一个实现了你定义的Service接口的代理类 - 后续你调用接口内的任意请求方法时,都会被代理类的
InvocationHandler拦截,Handler会自动解析方法上的注解(比如@GET、@POST、参数注解等),把请求路径、请求参数、请求头这些信息拼装成OkHttp请求,执行后再把响应结果解析成接口定义的返回值返回 - 整个过程全在运行时内存中完成,不会生成实体的代码文件,所以你在项目源码里看不到对应的实现类
2. Room DAO 采用编译期注解处理器生成代码
- Room依赖Android注解处理器(APT/KAPT),在你的项目编译阶段就会扫描所有带
@Dao注解的接口 - 注解处理器会根据DAO接口内的方法定义、方法上的注解(比如
@Query、@Insert、@Update)自动生成对应的实现类,类名规则为「接口名+_Impl」,比如你定义了UserDao接口,生成的实现类就是UserDao_Impl - 这些自动生成的类会被正常编译进APK,你可以在项目的
build/generated/source/kapt(Kotlin项目)或build/generated/source/apt(Java项目)目录下找到这些实体代码文件,内部就是封装好的原生SQLite操作逻辑
两种方案的核心都是利用注解信息自动生成模板代码,帮助开发者省去重复的通用逻辑编写工作,降低业务代码的冗余度。
内容的提问来源于stack exchange,提问作者OtienoSamwel
相关产品推荐
相关产品推荐

