注解的那些事儿(二)| 如何自定义注解

自定义注解是自己写框架的必备技能,使用注解能极大地提升开发效率,因此自定义注解是一个高级开发者必备的技能。

要自定义注解,首先需要了解一个注解的构成部分。

一个注解大致可以分为三个部分:注解体、元注解、注解属性

在在这三个主要组成部分中,注解体指定了注解的名字,而元注解则标记了该注解的使用场景、留存时间等信息,而注解属性则指明该注解拥有的属性。

文章首发于【博客园-陈树义】,点击跳转到原文《注解的那些事儿(二)| 如何自定义注解》

注解体

注解体是最简单的一个组成部分,只需要实例中一样有样学样即可。与接口的声明唯一的不同是在 interface 关键字前多了一个 @ 符号。

//声明了一个名为sweet的注解体
@Retention(RetentionPolicy.RUNTIME)
public @interface sweet{
}

元注解

元注解(meta-annotation)本身也是一个注解,用来标记普通注解的存留时间、使用场景、继承属性、文档生成信息。

元注解是一个特殊的注解,它是 Java 源码中就自带的注解。在Java 中只有四个元注解,它们分别是:@Target、@Retention、@Documented、@Inherited。

@Target注解

Target 注解限定了该注解的使用场景。

它有下面这些取值:

  • ElementType.ANNOTATION_TYPE 可以给一个注解进行注解
  • ElementType.CONSTRUCTOR 可以给构造方法进行注解
  • ElementType.FIELD 可以给属性进行注解
  • ElementType.LOCAL_VARIABLE 可以给局部变量进行注解
  • ElementType.METHOD 可以给方法进行注解
  • ElementType.PACKAGE 可以给一个包进行注解
  • ElementType.PARAMETER 可以给一个方法内的参数进行注解
  • ElementType.TYPE 可以给一个类型进行注解,比如类、接口、枚举
@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
public @interface Autowired {
    boolean required() default true;
}

在上面 Autowire的 注解中,其 Target 注解的值为 CONSTRUCTOR、METHOD、PARAMETER、FIELD、ANNOTATION_TYPE 这 5 个值。这表示 Autowired 注解只能在构造方法、方法、方法形参、属性、类型这 5 种场景下使用。

@Retention注解

Retention 注解用来标记这个注解的留存时间。

它其有四个可选值:

  • RetentionPolicy.SOURCE。注解只在源码阶段保留,在编译器进行编译时它将被丢弃忽视。
  • RetentionPolicy.CLASS。注解只被保留到编译进行的时候,它并不会被加载到 JVM 中。
  • RetentionPolicy.RUNTIME。注解可以保留到程序运行的时候,它会被加载进入到 JVM 中,所以在程序运行时可以获取到它们。
@Retention(RetentionPolicy.RUNTIME)
public @interface Autowired {
    boolean required() default true;
}

在上面 Autowire的 注解中,其 Retention 注解的值为 RetentionPolicy.RUNTIME,说明该注解会保留到程序运行的时候。

文章首发于【博客园-陈树义】,点击跳转到原文《注解的那些事儿(二)| 如何自定义注解》

@Documented

@ Documented 注解表示将注解信息写入到 javadoc 文档中。

在默认情况下,我们的注解信息是不会写入到 Javadoc 文档中的。但如果该注解有 @Documented 标识,那么该注解信息则会写入到 javadoc 文档中。

例如在下面这个例子中,我们声明了一个 @Spicy 的注解,没有 @Documented 元注解。

public @interface Spicy {
    String spicyLevel();
}

声明一个 @Sweet 注解,有 @Documented 元注解。

@Documented
public @interface Sweet {
    String sweetLevel();
}

接下来写一个 SweetDemo 类,类中的 sweetWithDoc 方法使用 @Sweet 注解,spicyWithoutDoc 方法使用 @Spicy 注解。

public class SweetDemo {
    public static void main(String arg[]) {
        new SweetDemo().sweetWithDoc();
        new SweetDemo().spicyWithoutDoc();
    }
    @Sweet (sweetLevel="Level.05")
    public void sweetWithDoc() {
        System.out.printf("sweet With Doc.");
    }
    @Spicy (spicyLevel="Level.04")
    public void spicyWithoutDoc() {
        System.out.printf("spicy Without Doc.");
    }
}

最后我们使用 Javadoc 命令去生成对应的 JavaDoc 文档,打开文档你会看到:sweetWithDoc方法上面有一个注解信息,而 spicyWithoutDoc 方法上却没有注解信息。

这个就是 @Documented 这个元注解的作用。

@Inherited

@ Inherited注解标识子类将继承父类的注解属性。

在下面的例子中,我们声明了一个 Sweet 注解,接着在 Peach 类使用了 @Sweet 注解,但是并没有在 RedPeach 类使用该注解。

//声明一个Sweet注解,标识甜味。
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@interface Sweet {}
//桃子有甜味
@Sweet
public class Peach {}
//红色的水蜜桃
public class RedPeach extends Peach {}

虽然我们没在 RedPeach 类上使用了 @Sweet 注解,但是我们在 Sweet 注解声明中使用了 @Inherited 注解,所以 RedPeach 继承了 Peach 的 @Sweet 注解。

注解属性

注解属性类似于类方法的声明,注解属性里有三部分信息,分别是:属性名、数据类型、默认值。

在 @Autowired 注解中就声明了一个名为 required 的 boolean 类型数据,其默认值是 true。

public @interface Autowired {
    boolean required() default true;
}

需要注意的是,注解中定义的属性,它的数据类型必须是 8 种基本数据类型(byte、short、int、long、float、double、boolean、char)或者是类、接口、注解及它们的数组。

总结

一个注解大致可以分为三个部分:注解体、元注解、注解属性。在这三个主要组成部分中:注解体指定了注解的名字、元注解则标记了该注解的使用信息,注解属性指明注解的属性。

学习注解只要知道这三个部分就够了,至于那些繁杂的属性,就用下面这张图来解决吧。用到的时候翻一翻,查一查,足矣!

文章首发于【博客园-陈树义】,点击跳转到原文《注解的那些事儿(二)| 如何自定义注解》

原文地址:https://www.cnblogs.com/chanshuyi/p/annotation_serial_02_self_define_annotation.html

时间: 2024-08-02 14:29:04

注解的那些事儿(二)| 如何自定义注解的相关文章

Springboot注解整理 二《自定义注解》

自定义注解 @Target({ ElementType.METHOD, ElementType.TYPE }) @Retention(RetentionPolicy.RUNTIME) @Inherited @Documented public @interface CommonLog { String value() default ""; } @Target @Target 说明了Annotation所修饰的对象范围 取值ElementType 的类型如下所示: public enu

【java开发系列】—— 自定义注解(转)

之前在开发中,就总纳闷,为什么继承接口时,会出现@Override注解,有时候还会提示写注解@SuppressWarnings? 原来这是java特有的特性,注解! 那么什么是注解呢? 注解就是某种注解类型的一个实例,我们可以用它在某个类上进行标注,这样编译器在编译我们的文件时,会根据我们自己设定的方法来编译类. 注解都是什么呢?看下面这张图就明白了! 上面的图可以看出,注解大体上分为三种:标记注解,一般注解,元注解 这里面Override这个没测试出来,因为目前的Eclipse会自动帮我们排错

跟王老师学注解(四):自定义注解

跟王老师学注解(四):自定义注解 主讲教师:王少华   QQ群号:483773664 到此,我们已经学习完了JDK提供的3种内建注解及4种元注解,下面来了解自定义注解 一.注解类型 (一)注解类型与接口:注解类型是一种接口,但它又不同于接口 1.注解类型使用关键字@interface而不是interface 1 2 public @interface TestAno { } @interface隐含继承java.lang.annotation.Annotation接口 2.注解类型的方法定义是独

Java注解(自定义注解、view注入)

注解这东西虽然在jdk1.5就加进来了,但他的存在还是因为使用Afinal框架的view注入才知道的.一直觉得注入特神奇,加了一句就可以把对应view生成了. 下面我们来认识一下注解这个东西 一.注解相关知识 注解相当于一种标记,在javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,就去干相应的事.标记可以加在包,类,字段,方法,方法的参数以及局部变量上. 1.元注解:作用是负责注解其他注解.Java5.0定义了4个标准的meta-annotati

spring中自定义注解(annotation)与AOP中获取注解

一.自定义注解(annotation) 自定义注解的作用:在反射中获取注解,以取得注解修饰的类.方法或属性的相关解释. package me.lichunlong.spring.annotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.R

Java连载109-sychronized关键的用途及其注意点、自定义注解

一.synchronized关键字 1.我们修改一下上一次连载中的withdraw方法 //synchronized关键字添加到成员方法上去可以达到同步内存变量的目的 public synchronized void withdraw(double money) { double after = this.balance - money; try { //这里我们故意延迟了一下,可以看出余额不对了 Thread.sleep(1000); }catch(InterruptedException e

Java自定义注解

自定义注解类编写的一些规则: 1. Annotation型定义为@interface, 所有的Annotation会自动继承Java.lang.Annotation这一接口,并且不能再去继承别的类或是接口. 2. 参数成员只能用public或默认(default)这两个访问权修饰 3. 参数成员只能用基本类型byte,short,char,int,long,float,double,boolean八种基本数据类型和String.Enum.Class.annotations等数据类型,以及这一些类

springmvc之自定义注解(annotation)

参考:日志处理 三:Filter+自定义注解实现 系统日志跟踪功能 1.项目结构 2.pom.xml,添加需要依赖 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://mav

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

引用: http://www.cnblogs.com/peida/archive/2013/04/24/3036689.html 要深入学习注解,我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前,我们就必须要了解Java为我们提供的元注解和相关定义注解的语法. 元注解: 元注解的作用就是负责注解其他注解.Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说明.Java5.0定义的元注解: [email protected

自定义注解入门

元注解: 元注解的作用就是负责注解其他注解.Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说明.Java5.0定义的元注解: [email protected], [email protected], [email protected], [email protected] 这些类型和它们所支持的类在java.lang.annotation包中可以找到.下面我们看一下每个元注解的作用和相应分参数的使用说明. @Target: @