文章目录
- 常见的几种注解
- 元注解
- 无参注解的定义
- 有参注解的定义
平常我们在编写代码中经常会看到这样的一种代码,@****,看着好像没有什么作用,像是注释,但又不是注释的形式,其实,这是注解…
常见的几种注解
下面举几个我们经常看见的例子:
//方法的重写
@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”)注解可以消除警告,还有点作用,其实后面学到框架,可以使用注解来进行参数的传递和读取,但目前我还没有学懂,留此备注,以后再添加进来