Android下自己实现依赖注入框架

在博客开始之前,我们先来介绍几个东西。

  1. 什么是注解?
    摘抄一下Google官方给的解释:

    An annotation is a form of metadata, that can be added to Java source code. Classes, methods, variables, parameters and packages may be annotated. Annotations have no direct effect on the operation of the code they annotate.
    注解简而言之就是对程序加上的一种标签,这个标签本身对源代码没有任何影响,我没有扯淡,注解本身对源代码确实没任何影响,实际上,注解所对应的操作是通过**APT(Annotation Processing Tool)**对程序中的注解进行检测进而执行的,比如检测到@Deprecated注解时,APT认为这个函数已被淘汰,于是APT会在函数上加上删除线,提醒开发者此函数已过时。

  2. Android下的注解类型主要包括哪几类?
    Android下注解主要包括三类:

    1. Java注解,包括@override、@Deprecated、@SuppressWarnings、@SafeVarargs(Java7新增)、@FunctionalInterface(Java8 新增),具体参考这篇博客:秒懂 Java注解类型(@Annotation)
    2. Android注解,需要添加Support Annotation Library依赖,具体可以参考这里:Support Annotation Library介绍及使用。
    3. 自定义注解,Android下支持自定义注解,形式如下:
package com.mystudy.annotationtest;

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

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Person {
    String name() default "";
    String sex() default ""; 
}

自定义注解需要以@interface关键字进行声明,并且方法体内的所有方法(这里是name()和sex()方法)都不能含有参数,只能用publicabstract这两个修饰符,默认采用的是public,且返回类型必须是基本类型,String, Class, annotation, enumeration 或者是他们的一维数组。
@Target:定义注解的作用目标

@Target(ElementType.TYPE) //接口、类、枚举、注解
@Target(ElementType.FIELD) //字段、枚举的常量
@Target(ElementType.METHOD) //方法
@Target(ElementType.PARAMETER) //方法参数
@Target(ElementType.CONSTRUCTOR) //构造函数
@Target(ElementType.LOCAL_VARIABLE)//局部变量
@Target(ElementType.ANNOTATION_TYPE)//注解
@Target(ElementType.PACKAGE) ///包

@Retention: 定义注解的保留策略

@Retention(RetentionPolicy.SOURCE) //注解仅存在于源码中,在class字节码文件中不包含
@Retention(RetentionPolicy.CLASS) // 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得
@Retention(RetentionPolicy.RUNTIME) // 注解会在class字节码文件中存在,在运行时可以通过反射获取到

所以这里我们写的自定义注解就是作用于方法且存在于字节码文件中,运行时可以通过反射拿到。

你可能感兴趣的:(Android进阶,Java)