Android开发经验谈Android面试经验程序员

注解——体系篇

2019-03-08  本文已影响73人  王帅Alex

一、前言

本文分析注解体系的主要目的有如下三点:

  1. 个人的知识体系的梳理,希望能把书由薄读厚,再由厚读薄;
  2. 下篇博文,仿ButterKnife框架的内容铺垫(近期更新);
  3. ORM类型框架中大量使用到了注解的内容,明确注解意义及使用方法,能够打通学习ORM类型框架的任督二脉。

进入正题:


图1 注解体系结构图

二、注解体系

1、注解概述

注解提供了一种为程序元素设置元数据的方法,从某些方面来看,注解就像修饰符一样,可以用于修饰包、类、构造器、方法、成员变量、参数、局部变量的声明,这些信息被储存在注解的“name=value”对中。

注解能被用来为程序元素(类、方法、成员变量)设置元数据。值得指出的是,注解不影响程序代码的执行,无论添加、删除注解,代码都始终如一的执行。如果希望让程序中的注解在运行时起一定的作用,只有通过某种配套的工具对注解中的信息进行访问和处理,访问和处理注解的工具统称为APT(Annotation Processing Tool)。

1.1 元数据(metadata)

元数据(metadata):就是关于数据的数据

1.2 什么是Annotation

1.3 注解基本知识

2、内置注解类型

2.1 内置注解类型—Override

public class InternalAnnotationTest {
    @Override
    public String toString() {
        return super.toString() + " [Override toString]";
    }

    public static void main(String[] args) {
        TestAnnotation test = new TestAnnotation();
        System.out.println(test);
    }
}

2.2 内置注解类型—Deprecated

public class InternalAnnotationTest {
    …
    @Deprecated
    public void test(){
        System.out.println("[Deprecated Annotation]");
    }
}

2.3 内置注解类型—SuppressWarnings

类型 作用
unused 未被使用的警告
deprecation 使用了不赞成使用的类或方法时的警告
unchecked 执行了未检查的转换时的警告
rawtypes 没有用泛型 (Generics) 的警告
fallthrough 当 Switch 程序块直接通往下一种情况而没有 Break 时的警告。
path 在类路径、源文件路径等中有不存在的路径时的警告。
serial 当在可序列化的类上缺少 serialVersionUID 定义时的警告。
finally 任何 finally 子句不能正常完成时的警告。
all 关于以上所有情况的警告。

举例如下:

public class InternalAnnotationTest {
@SuppressWarnings(value={"unchecked", "deprecation"})
    public void test() {
        Map map = new HashMap();
        map.put("name", "Alex");
        System.out.println(map);
    }
}

3、自定义注解类型

格式如下:

[访问修饰符] @interface 注解类型名 {
     数据类型 属性名() [default 默认值];//定义属性
}

举例如下:

public @interface AlexDebug{
}

public @interface AlexAnnotation{
    String value();
}

public @interfacle AlexType{
    int age() default 18;
}

4、元注解

元注解:对注解的注解

Java的API为我们提供的元注解如下:

4.1 @Target

指定此注解的适用时机

package java.lang.annotation;

public enum ElementType{
    TYPE,                         //适用于 类,接口,枚举
    FIELD,                        //适用于 成员字段
    METHOD,                       //适用于 方法
    PARAMETER,                    //适用于 方法的参数
    CONSTRUCTOR,                 //适用于 构造方法
    LOCAL_VARIABLE,              //适用于 局部变量
    ANNOTATION_TYPE,            //适用于 注解类型
    PACKAGE                   //适用于 包
}

举例如下:

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

//声明注解适用于方法
@Target({ElementType.METHOD})
public @interface AlexAnnotation {
}

4.2 @Retention

package java.lang.annotation;

public enum RetentionPolicy {
    SOURCE,      //编译器处理完后,并不将它保留到编译后的类文件中
    CLASS,         //编译器将注解保留在编译后的类文件中,但是在运行时忽略它
    RUNTIME     //编译器将注解保留在编译后的类文件中,并在第一次加载类时读取它
}

内置注解中的Override、SuppressWarnings的RetentionPolicy为SOURCE,而Deprecated为RUNTIME

4.3 @Documented

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface DocAnnotation {
}

4.5 @Inherited

举例如下:

@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface Alex{
    String name();
    int value();
}

@Alex(name="John Snow",age=32)
public class Parent{}

class SubClass extends Parent{}

4.6 @Repeatable

@interface Persons {
    Person[] value();
}

@Repeatable(Persons.class)
@interface HumanBeing{
    String role default "coder";
}


@Person(role="PM")
@Person(role="Teacher")
@Person(role="Reader")
public class Alex{
    
}

三、结语

1、一个技术开发人员老去的标志,绝不是老成稳重、沉默寡言,而是不肯再尝试,不肯再容许自己置身不熟悉的境地。
2、一个技术开发人员开始废掉的迹象之二,便是沉溺于短期快感之中,不再做长期投入。不再深入研究底层内容。在这里,我对注解相关的知识体系进行梳理,后续会推出更多的内容和大家分享。
3、一个技术开发人员开始废掉的迹象之三,是沦为抵触的情绪的奴隶。遇到新技术畏手畏脚,遇困难而退缩。

希望我们一起努力,加油!

上一篇 下一篇

猜你喜欢

热点阅读