android parcel 源码,Android Studio ParcelCreator Lint实现源码解析

b4791add4b2e?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

效果图

源码ParcelDetector.java

ParcelDetector实现了JavaPsiScanner java文件检测接口

核心代码

@Nullable

@Override

public List applicableSuperClasses() {

return Collections.singletonList(CLASS_PARCELABLE);

}

@Override

public void checkClass(@NonNull JavaContext context, @NonNull PsiClass declaration) {

if (declaration instanceof PsiAnonymousClass) {

// Anonymous classes aren't parcelable

return;

}

// Only applies to concrete classes

if (declaration.isInterface()) {

return;

}

if (declaration.hasModifierProperty(PsiModifier.ABSTRACT)) {

return;

}

// Parceling spans is handled in TextUtils#CHAR_SEQUENCE_CREATOR

if (context.getEvaluator().implementsInterface(declaration,

"android.text.ParcelableSpan", false)) {

return;

}

PsiField field = declaration.findFieldByName("CREATOR", true);

if (field == null) {

Location location = context.getNameLocation(declaration);

context.report(ISSUE, declaration, location,

"This class implements `Parcelable` but does not "

+ "provide a `CREATOR` field");

}

}

实现函数解析

applicableSuperClasses

这个方法用来返回你感兴趣的那些父类,所以这里android.os.Parcelable(SdkConstants.CLASS_PARCELABLE),此方法配合以下方法使用

checkClass(JavaContext context,PsiClass declaration)

检测到父类为以上指定的类是会触发此方法

判断是不是注解类 declaration instanceof PsiAnonymousClass

判断是不是接口declaration.isInterface()

判断是不是抽象类declaration.hasModifierProperty(PsiModifier.ABSTRACT)

判断PsiClass是否实现指定接口

JavaEvaluator.implementsInterface(PsiClass cls,String interfaceName,boolean strict)

interfaceName 接口名称如:android.text.ParcelableSpan

strict 不清楚(大多数代码都是false)

获取成员变量PsiClass.findFieldByName(String name, boolean checkBases)

name 变量名

是否校验父类

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值