JAVA注解原理 - 感性认识

一、什么是注解?

注解的英文是annotation,就是使用@符号来标注类、方法、类成员、局部变量、方法参数等。用于表示一些特殊的含义。比如我们常见的@Controller, @Service, @Repository, @Autowired等。

二、为什么要有注解? 注解有什么作用?

我理解这跟编程思想中的DRY(don't repeat yourself)的原则是吻合的。用统一的一个标识符@来标识一组具有相同属性的对象。
在Spring中,框架会自动扫描被标注的类,并把使用@Componet标注的类以bean的形式注入到框架中。方便供框架管理这些类的创建与销毁。
我们常用的JUnit,也会自动扫描被@Test标注的方法,认为它们是单独供JUnit框架管理的单测方法。
所以,使用注解,就是为了方便我们为类、方法、属性、参数等对象打一个标签,做一个标识。开发框架或架构师可以根据这些标识做自己的逻辑处理。

三、如何实现自定义注解?

3.1 通过元注解来实现注解

拿我们经常用到的@Autowired来举例,

@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {

    /**
     * Declares whether the annotated dependency is required.
     * <p>Defaults to {@code true}.
     */
    boolean required() default true;

}

解释:
通过 @interface 来声明一个注解。

@Target 说明注解所修饰的对象范围,取值的话,有

  1. CONSTRUCTOR: 构造器
  2. FIELD: 域
  3. LOCAL_VARIABLE: 局部变量
  4. METHOD: 方法
  5. PACKAGE: 包
  6. PARAMETER: 参数
  7. TYPE: 类、接口、enum声明

@Retention描述注解的生命周期,在什么时候生效,有3个

  1. SOURCE
  2. CLASS
  3. RUNTIME

@Documented说明可被javadoc此类工具文档化

@Inherited说明被标注的类型是被继承的(// TODO 举例说明)

3.2 如何获取注解名与值

通过反射。关于什么是反射,会单独写一个笔记来记录。在这里,我们先有一个概念,就是可以通过某一种方法来获取注解的名称,以及其中的值。
// todo 举例

@Hello
public class Any {

}

属性上的

@Hello
private String name;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,798评论 19 139
  • 什么是注解 注解对于开发人员来讲既熟悉又陌生,熟悉是因为只要你是做开发,都会用到注解(常见的@Override);...
    张明云阅读 25,611评论 6 154
  • 最近,北京打工的肓儿嫂范雨素火了。因为一篇感人至深,让千万人为之动容的文章。 看她的照片一一 朴素,平凡,简单,像...
    般若秋雪阅读 3,579评论 1 11
  • Unix指令 //在输入文件明时,按tab键可以提示输出所要的文件名 open +文件名 ——打开当前路径的文件 ...
    CharlesAn阅读 3,073评论 0 1
  • 第一招 每天早上一上班,在心里喊:我最重要的KPI是XXX 你每天打开电脑,面对一百多封未读邮件, 你每天接触十来...
    一刀职场阅读 2,607评论 0 0