资讯专栏INFORMATION COLUMN

【Java注解】注解基础

Warren / 2354人阅读

摘要:使用类加载器加载类找到类上面的注解拿到注解实例找到方法上的注解找到方法上的注解总结认识注解注解的作用范围和生命周期作用范围包类字段方法方法的参数局部变量生命周期源文件编译时运行时能读懂注解能在实际项目中用注解解决问题,并能自定义注解

笔记来源:IMOOC Java注解
注解的分类

按照运行机制分

源码注解:注解只在源码中存在,编译成 .class 文件就不存在了

编译时注解:注解在源码和 .class 文件中都存在

运行时注解:在运行阶段还起作用,甚至会影响运行逻辑的注解

按照来源分

来自JDK的注解

来自第三方的注解

我们自己定义的注解

元注解:给注解进行注解

自定义注解
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Description { // 使用 @interface 关键字定义注解
    String desc(); // 成员以无参无异常方式声明
    String author();
    int age() default 18; // 可以用 default 为成员指定一个默认值
}
自定义注解的语法要求

使用 @interface 关键字定义注解

成员以无参无异常方式声明

可以用 default 为成员指定一个默认值

成员类型是受限的,合法的类型包括原始类型及 StringClassAnnotationEnumeration

如果注解只有一个成员,则成员名必须取名为 value(),在使用时可以忽略成员名和赋值号 =

注解类可以没有成员,没有成员的注解称为标识注解

注解的注解(元注解)

@Target:注解的作用域

包、类、字段、方法、方法的参数、局部变量

@Retention:注解的生命周期

SOURCE:只在源码显示,编译时会丢弃

CLASS:编译时会记录到 class 中,运行时忽略

RUNTIME:运行时存在,可以通过反射读取

@Inherited:标识性注解,允许子类继承(接口实现是没有任何作用的,只会继承类注解,不会继承其他如方法的注解)

@Document:生成 javadoc 时会包含注解

使用自定义注解
@Description(desc = "I am eyeColor", author = "Mooc boy", age = 18)
public String eyeColor() {
    return "red";
}

@<注解名>(<成员名1> = <成员值1>, <成员名2> = <成员值2>, ...)

解析注解

概念:通过反射获取类、函数或成员上的运行时注解信息,从而实现动态控制程序运行的逻辑。

@Description(desc = "I am Example", author = "Mooc boy", age = 18)
public class Example {
    @Description(desc = "I am eyeColor", author = "Mooc boy", age = 18)
    public String eyeColor() {
        return "red";
    }
}
try {
    // 1. 使用类加载器加载类
    Class c - Class.forName("Example");
    // 2. 找到类上面的注解
    boolean isExist = c.isAnnotationPresent(Description.class);
    if (isExist) {
        // 3. 拿到注解实例
        Description d = (Description) c.getAnnotation(Description.class);
        System.out.println(d.desc());
    }
    Method[] ms = c.getMethods();
    // 4-1. 找到方法上的注解
    for (Method m: ms) {
        boolean isMExist = m.isAnnotationPresent(Description.class);
        if (isMExist) {
            Description d = (Description) c.getAnnotation(Description.class);
            System.out.println(d.desc());
        }
    }
    // 4-2. 找到方法上的注解
    for (Method m: ms) {
        Annotation[] as = m.getAnnotations();
        for (Annotation a: as) {
            Description d = (Description) a;
            System.out.println(d.desc());
        }
    }
} catch (Exception e) {
    e.printStackTrace();
}
总结

认识注解

注解的作用范围 @Target 和生命周期 @Retention

作用范围:包、类、字段、方法、方法的参数、局部变量

生命周期:源文件、编译时、运行时

能读懂注解

能在实际项目中用注解解决问题,并能自定义注解

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/69602.html

相关文章

  • Java基础02-自定义注解详解

    摘要:注解概念注解也被成为元数据为我们在代码中添加信息提供了一种形式化的方式,使我们可以在稍后的某个时刻更容易的使用这些数据。 注解 概念 注解(也被成为元数据)为我们在代码中添加信息提供了一种形式化的方式,使我们可以在稍后的某个时刻更容易的使用这些数据。 注解是 Java 5 所引入的众多语言变化之一: 注解使得我们可以以编译器验证的格式存储程序的额外信息 注解可以生成描述符文件,甚至是...

    andong777 评论0 收藏0
  • Java基础知识整理之注解

    摘要:注解提供了一种安全的类似注释的机制,用来将任何的信息或元数据与程序元素类方法成员变量等进行关联。为程序的元素类方法成员变量加上更直观更明了的说明,这些说明与程序的业务逻辑无关,并且提供给指定的工具或框架使用。 什么是注解? Annotation 是 Java5 之后开始引入的新特性,中文为注解。注解提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程序元素(...

    blastz 评论0 收藏0
  • 进击的Android工程师之Java基础注解

    摘要:基本语法我们通过注解的定义来切入注解的语法。跟定义接口差不多,就是用到的是,然后加上了元注解。那么元注解的作用是什么呢元注解元注解说明了注解所修饰对象的类型。也就是标识该注解可以被继承。的内置注解重写了父类的方法表示已过时,不推荐使用。 在Android开发中我们经常会用到注解,例如@Override Butterknife中的BindView等。这里主要记录下注解怎么写和简单的使用。...

    muddyway 评论0 收藏0
  • Java™ 教程(注解

    注解 注解(一种元数据形式)提供有关不属于程序本身的程序的数据,注解对它们注解的代码的操作没有直接影响。 注解有许多用途,其中包括: 编译器的信息 — 编译器可以使用注解来检测错误或抑制警告。 编译时和部署时处理 — 软件工具可以处理注解信息以生成代码、XML文件等。 运行时处理 — 可以在运行时检查某些注解。 本课程介绍了可以使用注解的位置,以及如何应用注解,Java平台标准版(Java S...

    econi 评论0 收藏0
  • Java 总结

    摘要:中的详解必修个多线程问题总结个多线程问题总结有哪些源代码看了后让你收获很多,代码思维和能力有较大的提升有哪些源代码看了后让你收获很多,代码思维和能力有较大的提升开源的运行原理从虚拟机工作流程看运行原理。 自己实现集合框架 (三): 单链表的实现 自己实现集合框架 (三): 单链表的实现 基于 POI 封装 ExcelUtil 精简的 Excel 导入导出 由于 poi 本身只是针对于 ...

    caspar 评论0 收藏0

发表评论

0条评论

Warren

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<