文章目录

  • 常见的几种注解
  • 元注解
  • 无参注解的定义
  • 有参注解的定义

平常我们在编写代码中经常会看到这样的一种代码,@****,看着好像没有什么作用,像是注释,但又不是注释的形式,其实,这是注解…

常见的几种注解

下面举几个我们经常看见的例子:

//方法的重写
@Override
// 不推荐使用注解, 但你非要用的话,也可以使用
@Deprecated
//消除代码警告(注意是警告,不是报错,别搞混了...),这个注解是带有参数的,一般加
//入"all"就可以了
@SuppressWarnings("all")

上面的两个例子我们经常看到,其实我们是可以自己自定义注解的,下面来示范如何自定义注解:

元注解

元注解:注解的注解,即Java为注解开发而特意准备的注解

想要自定义注解,首先先要了解什么是元注解,在查看源码可以发现,共有四大元注解分别为:

/**
 * 1.Target()注解,表示修饰注解的作用域,内部是一个ElementType[] value()数组,其中
 * value有多种,例如:TYPE,FIELD,METHOD,PARAMETER...
 */
@Target(value = {ElementType.METHOD,ElementType.TYPE,ElementType.FIELD}) // 作用域

/**
 * 2.Retention()注解,表示修饰注解的级别,内部是一个RetentionPolicy value()数组
 * value有三种种,例如: SOURCE,CLASS,RUNTIME,一般使用RUNTIME就足够了
 */
@Retention(RetentionPolicy.RUNTIME)  //运行时级别

/**
 * 3.Documented注解,表示生产DOc文档时候使用
 */
@Documented  // 生产DOc文档时候使用

/**
 * 4.Inherited注解,表示子类可以继承父类的注解
 */
@Inherited //子类可以继承父类的注解

无参注解的定义

接下来我们写一个简单的自定义无参注解:

@MyAnnotation
public class Test02 {
    private int age;
}

//四个元注解需要放在前面,第三个和第四个一般看情况加不加,例如这个注解没有Doc文档,也没
//有继承关系,所以此处不加也可以的
@Target(value = {ElementType.METHOD,ElementType.TYPE,ElementType.FIELD}) // 作用域
@Retention(RetentionPolicy.RUNTIME)  //运行时级别
@Documented  // 生产DOc文档时候使用
@Inherited //子类可以继承父类的注解
//自定义的注解
@interface MyAnnotation{

}

有参注解的定义

接下来往更深层次代码看:有参注解:

//消除警告注解
@SuppressWarnings("all")
public class Test03 {
	//自定义注解用来修饰方法
    @MyAnnotation2()
    public void test(){}
    /**
 	 * 可以看到下面我们定义的注解内部其实是有参数的,但是由于我们都给参数设置了默认值,
	 * 因此这里可以不用输入参数,而系统默认这个注解是:
	 * @MyAnnotation2(name="",age=0,id=-1,schools()={"str","Java"})
 	 */

    //只有一个参数的时候,默认使用value当做参数名字 , 使用的时候可以省略参数名
    @MyAnnotation3("Java")
    public void test2(){}

}

@Target(value = {ElementType.METHOD,ElementType.TYPE,ElementType.FIELD}) // 作用域
@Retention(RetentionPolicy.RUNTIME)  //运行时级别
//自定义注解@MyAnnotation2
@interface MyAnnotation2{
    //参数类型  参数名
    /**
    *参数类型 参数名 后加default表示默认,在使用注解的时候可以不用写参数
    */
    String name() default "";
    int age() default 0;
    int id() default -1; //表示不存在 , 类似于indexof的返回值
    String[] schools()  default {"str","Java"};

}

@Target(value = {ElementType.METHOD,ElementType.TYPE,ElementType.FIELD}) // 作用域
@Retention(RetentionPolicy.RUNTIME)  //运行时级别
@interface MyAnnotation3{
    String value();
}

注意:对于有默认值参数的注解,使用时可以写,也可以不写,不写JVM会默认使用默认值参数进行解释或读取。如果注解中有的参数有默认值有的参数没有默认值,则在使用注解的时候直接在括号中输入需要设置的参数就可以了,不需要使用逗号隔开

备注: 但从这里看到有参注解还是不了解有什么作用,但从目前来看,好像只有@SuppressWarnings(“all”)注解可以消除警告,还有点作用,其实后面学到框架,可以使用注解来进行参数的传递和读取,但目前我还没有学懂,留此备注,以后再添加进来