Android 常用注解一览

这篇具有很好参考价值的文章主要介绍了Android 常用注解一览。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

注解的使用有助于减少样板代码的编写,并提供了一种声明性的方法来描述代码的意图和行为。可以用于实现依赖注入,数据库映射、运行时权限处理等功能。

 文章来源地址https://www.toymoban.com/news/detail-760476.html

1. 值约束类型注解

@Nullable // 变量、参数或返回值可能为 null
@NonNull // 变量、参数或返回值不能为 null

@IntRange // 指定整型或长整型取值范围, eg:
    void setAlpha(@IntRange(from=0, to=255) int alpha) {...}

@FloatRange // 指定浮点型取值范围, eg:
    void setAlpha(@FloatRange(from=0.0, to=1.0) int alpha) {...}

@Size // 数组、集合或字符串的长度
    @Size(min=2)  // 最小长度
    @Size(max=2)  // 最大长度
    @Size(2)  // 固定长度
    @Size(multiple=2) // 必须为2的整数倍长度

  

2. 资源类型注解

@AnimatorRes // animator 资源类型
@AnimRes // anim 资源类型
@AnyRes // 任意资源类型
@ArrayRes // array 资源类型
@AttrRes // attr 资源类型
@BoolRes // boolean 资源类型
@ColorRes // color 资源类型
@DimenRes // dimen 资源类型
@DrawableRes // drawable 资源类型
@FractionRes // fraction 资源类型
@IdRes // id 资源类型
@IntegerRes // integer 资源类型
@InterpolatorRes // interpolator 资源类型
@LayoutRes // layout 资源类型
@MenuRes // menu 资源类型
@PluralsRes // plurals 资源类型
@RawRes // raw 资源类型
@StringRes // string 资源类型
@StyleableRes // styleable 资源类型
@StyleRes // style 资源类型
@TransitionRes // transition 资源类型
@XmlRes // xml 资源类型

 

3. 线程类型注解

@MainThread // 主线程
@UiThread // UI线程,除非不同线程显示不同UI,否则 @MainThread 与 @UiThread 无差别
@WorkerThread // 工作线程,不能执行UI操作
@BinderThread // 用于执行 ContentProvider 中的 query/insert/update/delete 方法
@AnyThread // 任意线程

  

4. 权限类型注解 @RequiresPermission

4.1 使用 @RequiresPermission 注解可以验证方法调用方是否拥有权限。

@RequiresPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
public abstract void onSaveToLocal(Bitmap bitmap) throws IOException;

  

4.3 如果是涉及多个权限,可以通过 anyOf 和 allOf 来控制判断条件:

(1) anyOf  注解权限列表是否满足任意一个: 

@RequiresPermission(anyOf = {
    Manifest.permission.READ_EXTERNAL_STORAGE,
    Manifest.permission.WRITE_EXTERNAL_STORAGE})
public static final void readFile(String dest) {
    // ...
}

(2) allOf  注解权限列表是否全部拥有:

@RequiresPermission(allOf = {
    Manifest.permission.READ_EXTERNAL_STORAGE,
    Manifest.permission.WRITE_EXTERNAL_STORAGE})
public static final void copyFile(String dest, String source) {
    // ...
}

  

5. 间接权限

如果权限依赖于提供给方法参数的特定值,请对参数本身使用 @RequiresPermission,而不用列出具体权限。例如, startActivity(Intent) 方法会对传递到方法的 intent 使用间接权限:

public abstract void startCallActivity(@RequiresPermission Intent intent, @Nullable Bundle b) {...}

在您使用间接权限时,构建工具将执行数据流分析以检查传递到方法的参数是否具有任何 @RequiresPermission 注解。随后,它们会对方法本身强制参数的任何现有注解。在 startActivity(Intent) 示例中,当一个不具有相应权限的 intent 传递到方法时,Intent 类中的注解会针对 startActivity(Intent) 的无效使用生成警告,例如:

@SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
@RequiresPermission(Manifest.permission.CALL_PHONE)
public static final String ACTION_CALL = "android.intent.action.CALL";

 

public void onCall() {
    Intent callIntent = new Intent(ACTION_CALL);
    startCallActivity(callIntent, null);
}

@Override
public void startCallActivity(@RequiresPermission Intent intent, @Nullable Bundle b) {
    intent.setData(Uri.parse("tel:" + phoneNumber));
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    if (b != null) {
        intent.setBundle(b);
    }
    startActivity(intent);
}

  

6. Java 注解

Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。 Java 语言中的类、方法、变量、参数和包等都可以被标注。和 Javadoc 不同,Java 标注可以通过反射获取标注内容。在编译器生成类文件时,标注可以被嵌入到字节码中。Java 虚拟机可以保留标注内容,在运行时可以获取到标注内容 。 当然它也支持自定义 Java 标注。

Java内置了三种标准注解,其定义在java.lang中。

@Override // 表示当前的方法定义将覆盖超类中的方法。
@Deprecated // 被此注解标记的元素表示被废弃,如果程序员使用了注解为它的元素,那么编译器会发出警告。
@SuppressWarnings // 关闭不当的编译器警告信息, 常用的有:
    ▪ @SuppressWarnings("unused") // 去除单类型告警
    ▪ @SuppressWarnings("unused", "unchecked") // 去除多类型告警
    ▪ @SuppressWarnings("all") // 去除全部类型告警

  

7. 自定义注解

 定义新的 Annotation 类型使用 @interface 关键字。

public @interface MyAnnotation {
    String name();  // 字符串
    String password() default "abc";  // 带默认值的字符串
    int age() default 18;  // 数值类型
    Gender gender() default Gender.FEMALE;  // 枚举类型
    Class clazz();  // 类类型
    MyAnnotation2 my2();  // 注解中包含其他注解
    char[] arr() default {'a', 'b', 'c'};  // 数组类型
}

引用:

@MyAnnotation(name="张三", age=38, gender=Gender.MALE, 
    class=String.class, my2=@MyAnnotion2(name="xxx"), 
    arr={'1','2','3'})
public void set() {...}

 

8. 元注解

元注解的作用是负责注解其他注解,主要分为6种:

@Retention  // 指定其所修饰的注解的保留策略;
@Document  // 该注解是一个标记注解,用于指示一个注解将被文档化;
@Target  // 用来限制注解的使用范围;
@Inherited  // 该注解使父类的注解能被其子类继承;
@Repeatable  // 该注解是Java8新增的注解,用于开发重复注解;
类型注解(Type Annotation)  // 该注解是Java8新增的注解,可以用在任何用到类型的地方。

  

8.1 @Retention 注解

@Retention 注解用于指定被修饰的注解可以保留到JVM哪个阶段。保留策略值有以下三个:

策略值 功能描述
Retention.SOURCE  注解只在保留在源文件中,在编译期间删除
Retention.CLASS 注解只在编译器间存在于.class文件中,运行时JVM不可获取信息,该策略值也是默认值 
Retention.RUNTION 可保留到JVM运行时期间,可以获取注解信息(反射),也是最长注解持续时间

【示例】保留到JVM运行时注解

@Retention(@RetentionPolocy.RUNTIME)
// 定义注解

  

8.2 @Document 注解

@Document 注解用于指定被修饰的注解可以被 javadoc 工具提取成文档,定义注解类时使用。

@Document 注解进行修饰,则所有使用该注解修饰的程序元素的 API 文档中将会包含该注解说明。

@Document
// 定义注解

  

8.3 Target 注解

@Target 注解用来限制注解的使用范围。

@Target({类型1, 类型2, ...})

  

枚举值 功能描述
ElementType.Type 可以修饰类、接口、注解或枚举类型
ElementType.FIELD 可以修饰属性,包括枚举常量
ElementType.METHOD 可以修饰方法
ElementType.PAPAMETER 可以修饰参数
ElementType.CONSTRUCTOR 可以修饰构造方法
ElementType.LOCAL_VARIABLE 可以修饰局部变量
ElementType.ANNOTATION_TYPE 可以修饰注解类
ElementType.PACKAGE 可以修饰包

 

@Target(ElementType.FIELD)
// 定义注解

  

8.4 @Inherited 注解

 @Inherited 注解指定注解具有继承性,如果摸个注解使用 @Inherited 进行修饰,则该类使用该注解是,其子类将自动被修饰。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface InheritedAnno1 {
    String comment();
    int order() default 0;
}

  

// 使用自定义的 @MyInheritedAnno 注解修饰 Base
@MyInheritedAnno(comment="继承注解", order=2)
public class Base {
}

// InheritedDemo 只继承了 Base 类
// 并被直接使用 @MyInheritedAnno 注解
public class InheritedDemo extends Base {
    public InheritedDemo() {
        // 从 InheritedDemo 中获取 MyInheritedAnno 注解信息
        MyInheritedAnno anno = InheritedDemo.class.getAnnotation(MyInheritedAnno.class);
        // 输出 MyInheritedAnno 注解成员信息
        Systen.out.println(anno.comment() + ":" + anno.order());
        // 打印 InheritedDemo 类是否具有 @MyInheritedAnno 修饰
        System.out.println(InheritedDemo.class.isAnnotationPresent(MyInheritedAnno.class));
    }
}

【运行结果】

继承注解:2

true

 

8.5 @Repeatable注解

@Repeatable 注解是 Java8 新增的注解,用于开发重复注解。在 Java8 之前,同一个程序元素前只能使用一个相同类型的注解,如果需要在同一个元素前使用多个相同类型的注解必须通过注解容器来实现。从 Java8 开始,允许使用多个相同的类型注解来修饰同一个元素,前提是该类型的注解是可重复的,即在定义注解时要用 @Repeatable 元注解进行修饰。

import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface AnnotContents { // 该注解是容器
    // 定义 value 成员变量,该成员变量可以接受多个 @RepeatableAnimal 注解
    RepeatableAnimal[] value();
}

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Repeatable(AnnotContents.class)
public @interface RepeatableAnimal {
    String name() default "蛋";
    int month();
}

  

@RepeatableAnimal(month = 1)
@RepeatableAnimal(name = "鸡", month = 6)
public class RepeatableAnnotDemo {
    public static void main(String[] args) {
        // 使用 java8 新增的 getDeclaredAnnotationsByType() 方法获取
        // 修饰类的多个 @RepeatableAnnot 注解
        RepeatableAnimal[] animals = RepeatableAnnotDemo.class.getDeclaredAnnotationsByType(RepeatableAnimal.class);
        // 遍历 @RepeatableAnnot 注解并显示
        for (RepeatableAnimal annot : animals) {
            System.out.println(annot.name() + "-->" + annot.month());
        }
        // 使用传统的 getDeclaredAnnotation()方法获取修饰类的 @AnnotContents 注解
        AnnotContents container = RepeatableAnnotDemo.class.getDeclaredAnnotation(AnnotContents.class);
        System.out.println(container);
    }
}

【运行结果】

蛋-->1
鸡-->6
@dinn.annotation.AnnotContents(value=[@dinn.annotation.RepeatableAnimal(name=蛋, month=1), @dinn.annotation.RepeatableAnimal(name=鸡, month=6)])

 

8.6 类型注解

Java8为ElementType枚举增加了TYPE_PARAMETER和TYPE_USE两个枚举类值,允许在定义枚举类时使用@Target(ElementType.TYPE_USE)来修饰,此种注解被称为“类型注解”(Type Annotation)。
在Java8之前,只能在定义类、接口、方法和成员变量等程序元素时使用注解,从Java8开始新增的类型注解可以用在任何用到类型的地方。
除了在定义类、接口和方法等常见的程序元素时可以使用类型注解,还可以在以下几个位置使用类型注解进行修饰:

  • 创建对象(使用new关键字创建)
  • 类型转换
  • 使用implements实现接口
  • 使用throws声明抛出异常序列
  • 方法参数
//定义一个简单的类型注解,不带任何成员变量
@Target(ElementType.TYPE_USE)
@interface NotNull{
}
 
//定义类时使用 @NotNull 类型注解
@NotNull
public class TypeAnnotationDemo implements @NotNull Serializable {// implements 时使用类型注解
    // 方法形参中使用类型注解
    public static void main(@NotNull String[] args) throws @NotNull FileNotFoundException { // throws 使用时用类型注解
        Object obj = "我是一直小小小小鸟";
        // 强制类型转换时使用类型注解
        String str = (@NotNull String)obj;
        // 创建对象时使用类型注解
        Object win = new @NotNull JFrame("QST_Login");
    }
    // 泛型中使用类型注解
    public void foo(List<@NotNull String> info){}
}

上述代码在各种情况下使用 @NotNull 类型注解,这种无处不在的类型注解可以让编译器执行更严格的代码检查,从而提高程序的健壮性。需要说明的是,上面的程序虽然大量使用了 @NotNull 类型注解,但这些注解是不会起到任何作用的,因为 Java 8本身并没有为这些类型注解提供处理工具,不能对类型注解执行检查框架。因此,如果需要类型注解发挥作用,需要程序员自己实现类型注解检查框架。目前有些第三方组织发布了类型注解检查工具,程序员可以直接使用这些第三方框架提供的检查工具,从而让编译器执行更严格的检查,以保证代码的健壮性。  

 

到了这里,关于Android 常用注解一览的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 常用短信平台一览,记得收藏哦

    市面上的短信平台很杂很多,小到几个人的公司、大到腾讯、阿里这样的巨无霸都在做,但常用的就那么几个,因而用户的选择也存在不少的困惑。 在我看来,我觉得选择短信平台、在我看来有这几个需要的注意地方: 1、价格 无论是企业还是个人做项目,这应该是考虑的最

    2024年02月02日
    浏览(38)
  • 【小程序从0到1】小程序常用组件一览

    欢迎来到我的博客 📔博主是一名大学在读本科生,主要学习方向是前端。 🍭目前已经更新了 【Vue】、【React–从基础到实战】、【TypeScript】等等系列专栏 🛠目前正在学习的是🔥 R e a c t / 小程序 React/小程序 R e a c t / 小程序 🔥,中间穿插了一些基础知识的回顾 🌈博客主

    2024年01月24日
    浏览(21)
  • MyBatis实战指南(三):常用注解及使用方法

    在前面的两篇文章中,我们已经详细介绍了MyBatis的工作原理和基本使用。今天,我们将深入探讨MyBatis的一个重要特性——注解。如果你对MyBatis的注解还不熟悉,那么这篇文章将为你打开一扇新的大门。 首先,我们需要明白什么是注解。注解 Annotation 是从JDK1.5开始引入的新技

    2024年01月19日
    浏览(50)
  • C++和Python最常用的库框架一览

    1. 标准模板库(STL) STL包含丰富的数据结构与算法。比如vector动态数组;list双向链表;map基于红黑树实现,支持快速查找键值对。常用算法有sort排序、find搜索等。这些容器算法类和函数模板,是C++程序员必不可少的基础。 2. Boost Boost是近年兴起的高质量C++库集合,涵盖多种应用领域

    2024年01月20日
    浏览(36)
  • Spring Boot中最常用注解的使用方式(下篇)

    摘要:本文是《深入解析Spring Boot中最常用注解的使用方式》的下篇内容,将继续介绍Spring Boot中其他常用的注解的使用方式,并通过代码示例进行说明,帮助读者更好地理解和运用Spring Boot框架。 1.@Autowired @Autowired :自动装配依赖对象。示例代码如下: 2. @Configuration @Config

    2024年02月07日
    浏览(41)
  • Spring Cache的介绍以及使用方法、常用注解

    Spring Cache是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能. Spring Cache提供了一层抽象,底层可以切换不同的cache实现。具体就是通过CacheManager接口来统一不同的缓存技术。 CacheManager是Spring提供的各种缓存技术抽象接口。 针对不同的缓存

    2024年02月16日
    浏览(38)
  • Spring Boot中最常用注解的使用方式(上篇)

    摘要:本文将详细介绍Spring Boot中最常用的注解的使用方式,并通过代码示例加以说明。通过学习这些注解,读者将能够更好地理解和运用Spring Boot框架,构建高效的企业级应用。 1.@RequestMapping @RequestMapping :将一个HTTP请求映射到对应的控制器方法上。可以用于类和方法级别。

    2024年02月07日
    浏览(48)
  • Hadoop3教程(三):HDFS文件系统常用命令一览

    hdfs命令的完整形式: 其中subcommand有三种形式: admin commands client commands:如本节重点要讲的dfs daemon commands dfs(文件系统命令),这个是HDFS里,日常使用 最为频繁的一种命令 ,用来在HDFS的文件系统上运行各种文件系统命令,如查看文件、删除文件等。 基本语法: 这俩基本

    2024年02月06日
    浏览(68)
  • 保护您的Android应用程序:Android应用程序安全一览

    我们都知道Android是为所有人设计的——开放、面向开发者、面向用户,这种开放性为今天和明天的移动技术提供了很多便利。然而,开放性也带来了需要妥善处理的安全风险。 安全是我们所有人都关注的重要问题。无论是我们的个人数据、电子邮件、电话号码、凭证、服务

    2024年02月03日
    浏览(71)
  • Spring很常用的@Conditional注解的使用场景和源码解析

    你好,我是刘牌! 今天要分享的是Spring的注解@Conditional,@Conditional是一个条件注解,它的作用是判断Bean是否满足条件,如果满足条件,则将Bean注册进IOC中,如果不满足条件,则不进行注册,这个注解在SpringBoot中衍生出很多注解,比如 @ConditionalOnProperty , @ConditionalOnBean ,

    2023年04月14日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包