1.基于Dagger2.38.1的hilt源码-AndroidEntryPointProcessor

前言

主要介绍hilt的整体框架,当前源码的讲解使用到案例会基于hilt demo。可自行下载。

AndroidEntryPointProcessor类处理@AndroidEntryPoint和@HiltAndroidApp注解。当前使用该注解的节点校验并且生成AndroidEntryPointMetadata对象,针对该`AndroidEntryPointMetadata对象再生成类。

校验并生成AndroidEntryPointMetadata对象

使用@AndroidEntryPoint或@HiltAndroidApp注解修饰的节点规则校验,校验过程中生成AndroidEntryPointMetadata对象。

校验规则

  1. 节点使用@HiltAndroidApp或@AndroidEntryPoint注解修饰有且仅有一个;

  2. @HiltAndroidApp或@AndroidEntryPoint注解只能用于修饰类,而不能用于修饰接口;

  3. @HiltAndroidApp或@AndroidEntryPoint注解修饰的类不能使用泛型;

  4. 判断 - @HiltAndroidApp或@AndroidEntryPoint注解修饰的类禁止超类验证(默认true) && @HiltAndroidApp或@AndroidEntryPoint注解的value值是Void.class类型:

  • 4.1 true: @HiltAndroidApp或@AndroidEntryPoint注解修饰的类不是kotlin文件 || 如果是kotlin文件,那么该类存在不是默认参数的构造函数;

  • 4.2 false:

  • ① @HiltAndroidApp或@AndroidEntryPoint注解的value值不能是Void类型;

  • ② @HiltAndroidApp或@AndroidEntryPoint注解修饰的类KaTeX parse error: Expected group after '_' at position 19: …SS extends Hilt_̲CLASS;

  1. @HiltAndroidApp或@AndroidEntryPoint注解的value值类型,不能是@HiltAndroidApp或@AndroidEntryPoint注解修饰的类;否则形成死循环;

  2. baseElement表示@HiltAndroidApp或@AndroidEntryPoint注解的value值节点(或@HiltAndroidApp或@AndroidEntryPoint注解修饰的类的父类),如果baseElement使用了@HiltAndroidApp或@AndroidEntryPoint注解修饰:

  • (1) @HiltAndroidApp或@AndroidEntryPoint注解修饰的类 和 其baseElement节点要么都使用@WithFragmentBindings注解修饰,要么都不要使用该注解;

  • (2) @HiltAndroidApp或@AndroidEntryPoint注解修饰的类不要使用@OptionalInject修饰的注解修饰 || baseElement类型使用@OptionalInject修饰的注解修饰;

  1. @HiltAndroidApp只能用于修饰Application的继承类;

  2. @AndroidEntryPoint可用于修饰Activity、Service、Broadcast_service,Fragment,View:

  • (1)@AndroidEntryPoint用于修饰Activity时,只能修饰androidx.activity.ComponentActivity的继承节点;

  • (2)@AndroidEntryPoint不能用于修饰Application的继承类。

AndroidEntryPointMetadata对象属性

  1. TypeElement element: @HiltAndroidApp或@AndroidEntryPoint注解修饰的类;

  2. TypeElement baseElement: @HiltAndroidApp或@AndroidEntryPoint注解的value值节点或@HiltAndroidApp或@AndroidEntryPoint注解修饰的类的父类;

  3. ClassName generatedClassName:@HiltAndroidApp或@AndroidEntryPoint注解修饰的类KaTeX parse error: Expected group after '_' at position 18: …ASS生成的类名 - Hilt_̲CLASS;

  4. boolean requiresBytecodeInjection: 判断 - @HiltAndroidApp或@AndroidEntryPoint注解修饰的类禁止超类验证 && @HiltAndroidApp或@AndroidEntryPoint注解的value值是Void.class类型;

  5. AndroidEntryPointMetadata.AndroidType androidType: Type类的androidType属性;

  • 注:下面有对AndroidType对象的描述;
  1. Optional baseMetadata:baseElement(或其父节点)如果使用了@HiltAndroidApp或@AndroidEntryPoint注解修饰,生成的AndroidEntryPointMetadata对象;

  2. ImmutableSet installInComponents:Type类的component属性;

  • 注:下面有对Type类的描述;
  1. TypeName componentManager:Type类的manager属性;

  2. Optional componentManagerInitArgs:Type类的componentManagerInitArgs属性;

Type

该类主要有以下四个属性:

  1. ClassName component;
  2. AndroidType androidType;
  3. ClassName manager;
  4. CodeBlock componentManagerInitArgs。

针对Application、service、broadcast_receiver、activity、fragment和view组件采用不同处理。

Application

  1. ClassName component:SingletonComponent接口;
  2. AndroidType androidType:AndroidType.APPLICATION;
  3. ClassName manager:ApplicationComponentManager类
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值