ButterKnife源码学习一:必备知识点

本文详细介绍了Java注解的使用,包括普通注解、元注解和自定义注解,探讨了APT的工作原理及如何利用反射在运行时读取注解信息,最后解析了ButterKnife框架的工作流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、注解

普通注解

1、@Override

2、@Deprecated

3、@SuppressWarnings

元注解

1、@Document

2、@Target

3、@Retention

4、@Inherited

@Documented
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface metaTest {
    public String doTest();
}

自定义注解

二、APT工作原理

注解处理器(Annotation Processor)是javac的一个工具,每一个处理器都继承于AbstractProcessor。

1、声明的注解的生命周期为CLASS

2、继承AbstractProcessor类

3、再调用AbstractProcessor的process方法 

三、反射 + 运行时注解举例

反射的作用:

1、判断任意一个对象所属的类

2、构造任意一个类的对象

3、判断任意一个类所具有的成员变量和方法(通过反射甚至可以调用private方法)

4、调用任意一个对象的方法

反射的缺陷:

对JVM的性能有影响,因为JVM无法对反射的代码进行内存优化,同时反射会产生大量的临时对象,导致大量的GC,
从而造成内存抖动,可能会导致UI卡顿

举例:在idea中运行

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface TestInterface {
    int value() default 100;
}


public class ReflectMain {
    @TestInterface(12)
    public int age;

    public static void main(String[] args) {
        ReflectMain main = new ReflectMain();
        TestInterface testInterface = null;
        try {
            Class clazz = main.getClass();
            Field field = clazz.getField("age");
            testInterface = field.getAnnotation(TestInterface.class);
            System.out.print(testInterface.value());
        } catch (NoSuchFieldException e) {
            System.out.print("no such field");
        }
    }
}

四、ButterKnife的工作原理

1、编译的时候扫描注解,并做相应的处理,生成java代码(调用javapoet库生成)。

2、调用ButterKnife.bind(this)方法的时候,将ID与对应的上下文绑定在一起。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值