Android 注解快速入门和实用解析

澳门新葡亰手机版 1

首先什么是注解?@Override就是注解,它的作用是:

注解的简介

简介

Annotations, a form of metadata, provide data about a program that is
not part of the program itself. Annotations have no direct effect on
the operation of the code they annotate.

澳门新葡亰手机版,注释是元数据的一种形式,为程序的元素(类、方法、变量)提供一些说明,但是不会对程序本身造成影响。

  • Annotation
    类似一种修饰符,用于修饰包、类型、构造方法、方法、成语变量、参数的声明语句。
  • Annotation
    是一个接口。通过反射来访问annotation信息。根据获取的信息来决定如何使用注解信息来做一些事情。
  • Annotation 不会对程序造成影响。
  • Java预言解析器在工作的时候默认是忽略这些annotation,所以在JVM中”不起作用”,只有通过配套的工具才能对这些注解进行访问和处理。
1、检查是否正确的重写了父类中的方法。 
2、标明代码,这是一个重写的方法。

Annotation的使用

  • Annotation的声明需要通过@interface这个关键字。会继承Annotation接口。
  • Annotation的方法必须声明为无参数、无异常。方法名代表成员变量名,方法的返回值代表了成员变量的类型。而且返回值类型必须为基本数据类型、Class类型、枚举类型、String类型、Annotation类型或者由前面任意一种类型组成的一维数组。方法后面可以使用default和一个默认数值来声明一个成员变量的默认值,null不能作为成员变量的默认值。
  • 注解中如果只有一个默认属性,可以直接使用value()函数,一个属性也没有的则表示该Annotation为Mark
    Annotation。
    例如:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Test {
    String value();
}

直接使用@Test(“demo”),等同于@Test(value=”demo”)
添加默认值:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface TestDefault {
    public String description() default "demo";
}

1、体现在于:检查子类重写的方法名与参数类型是否正确;检查方法private/final/static等不能被重写。实际上@Override对于应用程序并没有实际影响,从它的源码中可以出来。

Annotation的作用

很多使用作为一种辅助途径,应用在软件框架或工具中。这些工具类可以根据不同的Annotation心采取不同的处理,具有”让编译器进行编译检查的功能”

2、主要是表现出代码的可读性。

具体可分为以下三种作用:

  1. 标记,告诉编译器一些信息(RetentionPolicy.SOURCE)
  2. 运行时动态处理,如通过反射的信息获取注解信息进行操作(RetentionPolicy.RUNTIME)
  3. 编译时动态处理,如生成代码或XML(RetentionPolicy.CLASS)

澳门新葡亰手机版 1

分类

标准的Annotation
从1.5开始就自带三张标准的Annotation类型:

  • Override
    它是一种marker类型的Annotation,用来标注方法,说明被它标注的方法是重载了父类中的方法。如果我们使用了该注解到一个没有覆盖父类方法的方法时,编译器就会提示一个编译错误的警告。
  • Deprecated
    它也是一种marker类型的Annotation。当方法或者变量使用该注解时,编译器就会提示该方法已经废弃。
  • SuppressWarnings
    它不是marker类型的Annotation。用户告诉编译器不要再对该类、方法或者成员变量进行警告提示。
    元Annotation
    元Annotation是指用来定义Annotation的Annotation
  • @Retention
    保留时间,可为RetentionPolicy.SOURCE(源码时)、RetentionPolicy.CLASS(编译时)、RetentionPolicy.RUNTIME(运行时),默认为CLASS。如果值为RetentionPolicy.SOURCE那大多都是Mark
    Annotation,例如:Override、Deprecated。SOURCE表示仅存在于源码中,在class文件中不会包含。CLASS表示会在class文件中存在,但是运行时无法获取。RUNTIME表示会在class文件中存在,并且在运行时可以通过反射获取。
  • @Target
    用来标记可进行修饰哪些元素,例如ElementType.TYPE、ElementType.METHOD、ElementType.CONSTRUCTOR、ElementType.FIELD、ElementType.PARAMETER等,如果未指定则默认为可修饰所有。
  • @Inherited
    子类是否可以继承父类中的该注解。它所标注的Annotation将具有继承性。
  • @Documented
    是否会保存到javadoc文档中。

作为Android开发中熟知的注解,Override只是注解的一种体现,更多时候,注解还有以下作用:

自定义Annotation

在Android的获取控件中都需要findViewById()来获取,通过注解的来获取到Id的值进行绑定例如:

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ViewInject{
    int viewId();
}

注解声明完后,可以定义一些控件来使用:

@ViewInject(viewId = R.id.test)
    private TextView test;