Annotation注解及元注解

在使用许多第三方框架的时候,查阅源码如ButterKnife等。发现许多注解的使用,顿时觉得注解都玩不溜怎么称霸武林。当然无论Java还是Android的SDK中都有大量注解的使用,以前总是走马观花,印象中知道注解代表的意思,但开口总是说不清道不明,唯有总结方得始终。

注解是附加在代码中的一些信息,可以帮助一些代码分析工具如Lint分析代码,辅助开发者改善代码,对于开发者来说有个提示、警告的作用。但注解不会改变代码逻辑。在此总结了几个Android开发常见的注解的解释,以及对元注解的基本认识。

常见的几个注解

1、@TargetApi

2、@RequiresApi

3、@suppressLint

4、@SuppressWarnings

@TargetApi(Build.VERSION_CODES.M)@TargetApi(23)

Lint会按照API版本M以上扫描代码,而不是project中指定的minSDKVersion,可以使得高版本Api在低版本SDK上Lint不报错。如果只加这个注解,表明这段代码只能在23及以上的系统上运行,如果你非要在23以下的系统上运行,那该警告的已经警告了,你只是忽略了警告,但运行时该错还是错。

@RequiresApi(api = Build.VERSION_CODES.M)

表示注解目标只能够在指定的版本API及以上运行,消除高版本Api在低版本SDK上的报错,作用上和TargetApi相同,只是在词面上更清楚表达了这是一个建议,而不仅仅是为了消除高版本Api在低版本SDK上的报错。从官方的表述可以看出更推荐使用RequiresApi替换TargetApi。

@SuppressLint("NewApi")

最直接暴力屏蔽指定名称的报错,这里的NewApi对应的具体错误名称是:Calling new methods on older versions。这里的NewApi只是一个缩写名称。相比于@TargetApi指定了版本号,SuppressLint是一律屏蔽,所以一般不建议使用。当然还可以指定任何其他Lint定义好的错误名称。在settings中查找Inspections可以找到预先定义好的所有Error、Warning。对于多个错误,使用逗号隔开。

在XML中类似的做法有:

tools:ignore="ScrollViewCount,UselessParent"忽略XML中的两个警告。

@SuppressWarnings("NumericOverflow")

屏蔽NumericOverflow警告,如:int a = 1 / 0;

一般的语句注解方式suppress for statement

@SuppressWarnings("NumericOverflow")

int a = 10 / 0;

注释注解方式statement for statement with comment

//noinspection NumericOverflow(以前总是看到这样的注释,但并不知道也是注解)

int a = 10 / 0;

当然,这些注解可以使用在许多地方如:class、method、statement,分别对应由大到小不同的作用域类、方法、语句,当然作用域范围越大,那么性能损耗自然越大。

Annotation不影响代码逻辑

这些注解的作用只是去除Lint的错误警告,并不能影响任何的代码逻辑。

所以必须在代码中添加相应的兼容性判断代码,如:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

color = getColor(R.color.colorAccent);

}

当然,当你添加完上述兼容代码后,警告也就消失了。

元注解(注解的注解)

常见的元注解:

1、@Documented

2、@Inherited

3、@Retention

4、@Target

分析SuppressLint的定义:

@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})

@Retention(RetentionPolicy.CLASS)

public @interface SuppressLint {

value();

}

@Target定义作用目标

其中@Target指定了SuppressLint的作用目标,具体TYPE、FIELD等代表什么,可以在java.lang.annotation.ElementType里面找到。

例如:TYPE表示

/** Class, interface (including annotation type), or enum declaration */

即包含了类、接口(包括注解)、枚举类型。

例如:@Override注解

@Target(ElementType.METHOD)  重写,只能作用于方法

@Retention(RetentionPolicy.SOURCE)  只存在于编码阶段,编译阶段就失效了

public @interface Override {}

@Retention定义保留策略

1、PetentionPolicy.SOURCE 仅保留在源码阶段,编译阶段就失效

2、PetentionPolicy.CLASS默认策略,会保留到编译出字节码阶段,运行时失效

3、PetentionPolicy.RUNTIME 保留到VM的运行时阶段,可通过反射获得

@Documented   注解将被写入javadoc

@Inherited   子类可以继承父类中的该注解

@Repeatable   找不到例子,有待理解

@Native   尚处于Preview状态,表示常量有可能被本地代码引用

时间: 2024-10-11 02:48:33

Annotation注解及元注解的相关文章

Spring组合注解与元注解

目录 注解说明 源代码 使用范例 注解说明 元注解:可以注解到别的注解上的注解,所以元注解首先基于条件@Target({ElementType.TYPE}) ,目标使用在类文件上 . 组合注解:连个元注解组合在一起的注解,注解A使用了注解B,那么注解A就叫组合注解,注解A会继承注解B的功能. 源代码 springBoot的入口注解@SpringBootApplication是一个组合注解,由注解@EnableAutoConfiguration.@SpringBootConfiguration,@

Spring----组合注解与元注解

1.概述 1.1.Spring提供了大量的注解, 尤其是相同的注解用到各个类中,会相当的啰嗦: 1.2.元注解: 可以注解到别的注解上的注解: 组合注解: 被注解注解的注解称为 组合注解: 组合注解  具备 元注解  的功能,Spring的很多注解都可以作为元注解: 1.3.案例 package com.an.config; import com.an.annotation.MyAnnotation; /** * @description: * @author: anpeiyong * @dat

组合注解与元注解

从spring2开始,为了响应jdk1.5推出的注解功能,spring开始大量加入注解来代替xml配置.随着注解的大量使用,我们发现多个相同的注解被在不同的类或者方法里多次使用的时候,代码看起来比较繁琐.这就是所谓的样板代码,是spring设计原则中要消除的代码.比如以下代码: 如果我们把以上三个注解合并为一个注解,那多省事儿!这就是组合注解,与之相对的就是元注解. 元注解就是可以注解到别的注解上的注解,被注解的注解就是组合注解. 额,好乱.元注解就是可以用来跟别的注解搭配,从而构造出新的注解的

JavaEE开发之Spring中的条件注解、组合注解与元注解

上篇博客我们详细的聊了<JavaEE开发之Spring中的多线程编程以及任务定时器详解>,本篇博客我们就来聊聊条件注解@Conditional以及组合条件.条件注解说简单点就是根据特定的条件来选择Bean对象的创建.条件注解就是可以根据不同的条件来做出不同的事情.在Spring中条件注解可以说是设计模式中状态模式的一种体现方式,同时也是面向对象编程中多态的应用部分.而组合注解就是将现有的注解进行组合.下方会给出具体的介绍和实例. 一.条件注解[email protected] 本篇博客的本部分

深入理解Java:注解(Annotation)自己定义注解入门

深入理解Java:注解(Annotation)自己定义注解入门 要深入学习注解.我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前.我们就必须要了解Java为我们提供的元注解和相关定义注解的语法. 元注解: 元注解的作用就是负责注解其它注解. Java5.0定义了4个标准的meta-annotation类型.它们被用来提供对其它 annotation类型作说明.Java5.0定义的元注解: [email protected], [email protected], [email pro

Java中的元注解

注解为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后某个时刻非常方便地使用这些数据. 通过使用注解,我们可以将这些元数据保存在Java源代码中,并利用annotation API为自己的注解构造处理工具.注解必须佩戴自己相应的处理器,不然注解没有任何意思! 基本形式 在Java中定义一个注解的基本方式为: 1 import java.lang.annotation.RetentionPolicy; 2 import java.lang.annotation.Target; 3 4

Java 注解入门实例 &amp;&amp; 注解传参

参考 概念:java提供了一种原程序中的元素关联任何信息和任何元数据的途径和方法 JDK内置系统注解: @Override 用于修饰此方法覆盖了父类的方法; @Deprecated 用于修饰已经过时的方法; @Suppvisewarnings 用于通知java编译器禁止特定的编译警告. 注解按照运行机制划分 源码注解:注解只在源码中存在,编译成.class文件就不存在了: 编译时注解:注解在源码和.class文件中都存在(例:JDK自带注解): 运行时注解:在运行阶段还起作用,甚至会影响运行逻辑

深入浅出Java Annotation(元注解和自定义注解)

一.基本概述 Annontation是Java5开始引入的新特征.中文名称一般叫注解.它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程序元素(类.方法.成员变量等)进行关联. 更通俗的意思是为程序的元素(类.方法.成员变量)加上更直观更明了的说明,这些说明信息是与程序的业务逻辑无关,并且是供指定的工具或框架使用的. Annontation像一种修饰符一样,应用于包.类型.构造方法.方法.成员变量.参数及本地变量的声明语句中. 二.原理 Annotation其实是

Java元注解

元注解的作用是负责注解其他注解.Java定义了4中标准的元注解类型,他们被用来提供对其他注解的说明. @target @Retention @Documented @Inherited 这些类型可以和他们所支持的类在Java.lang.annotation包中找到 每个元注解的作用: @target 修饰了annotation所修饰的对象范围,annotation可被用于package,type(类,接口,枚举,annotation),和类型成员(方法,构造方法,成员变量,枚举值).方法参数和本