沃梦达 / IT编程 / 移动开发 / 正文

Android注解基础介绍快速入门与解读

首先什么是注解,它的作用是什么,本文讲解了Android注解的最基本内容与实例解读

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

1、检查是否正确的重写了父类中的方法。
2、标明代码,这是一个重写的方法。

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

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

IiBzcmM9

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

降低项目的耦合度。

自动完成一些规律性的代码。

自动生成java代码,减轻开发者的工作量。

一、注解基础快读

1、元注解

元注解是由java提供的基础注解,负责注解其它注解,如上图Override被@Target@Retention修饰,它们用来说明解释其它注解,位于sdk/sources/android-25/java/lang/annotation路径下。

元注解有:

@Retention:注解保留的生命周期

@Target:注解对象的作用范围。

@Inherited:@Inherited标明所修饰的注解,在所作用的类上,是否可以被继承。

@Documented:如其名,javadoc的工具文档化,一般不关心。

@Retention

Retention说标明了注解被生命周期,对应RetentionPolicy的枚举,表示注解在何时生效:

SOURCE:只在源码中有效,编译时抛弃,如上面的@Override

CLASS:编译class文件时生效。

RUNTIME:运行时才生效。

如下图,com.android.support:support-annotations中的Nullable注解,会在编译期判断,被注解的参数是否会空,具体后续分析。

IiBzcmM9

@Target

Target标明了注解的适用范围,对应ElementType枚举,明确了注解的有效范围。

TYPE:类、接口、枚举、注解类型。

FIELD:类成员(构造方法、方法、成员变量)。

METHOD:方法。

PARAMETER:参数。

CONSTRUCTOR:构造器。

LOCAL_VARIABLE:局部变量。

ANNOTATION_TYPE:注解。

PACKAGE:包声明。

TYPE_PARAMETER:类型参数。

TYPE_USE:类型使用声明。

如上图所示,@Nullable可用于注解方法,参数,类成员,注解,包声明中,常用例子如下所示:


 /**
  * Nullable表明
  * bind方法的参数target和返回值Data可以为null
  */
 @Nullable 
 public static Data bind(@Nullable Context target) {  //do someThing and return
  return bindXXX(target);
 }

@Inherited

注解所作用的类,在继承时默认无法继承父类的注解。除非注解声明了 @Inherited。同时Inherited声明出来的注,只对类有效,对方法/属性无效。

如下方代码,注解类@AInherited声明了Inherited ,而注解BNotInherited 没有,所在在它们的修饰下:

类Child继承了父类Parent的@AInherited,不继承@BNotInherited

重写的方法testOverride()不继承Parent的任何注解;

testNotOverride()因为没有被重写,所以注解依然生效。


@Retention(RetentionPolicy.RUNTIME) 
@Inherited public @interface AInherited { 
  String value(); 
} 
@Retention(RetentionPolicy.RUNTIME) 
public @interface BNotInherited { 
  String value(); 
} 

@AInherited("Inherited") 
@BNotInherited("没Inherited") 
public class Parent { 

  @AInherited("Inherited") 
  @BNotInherited("没Inherited") 
  public void testOverride(){ 

  } 
  @AInherited("Inherited") 
  @BNotInherited("没Inherited") 
  public void testNotOverride(){
  }
} 

/**
 * Child继承了Parent的AInherited注解
 * BNotInherited因为没有@Inherited声明,不能被继承
 */public class Child extends Parent { 

 /**
  * 重写的testOverride不继承任何注解
  * 因为Inherited不作用在方法上
  */
  @Override 
  public void testOverride() { 
  } 

 /**
  * testNotOverride没有被重写
  * 所以注解AInherited和BNotInherited依然生效。
  *

本文标题为:Android注解基础介绍快速入门与解读