0%

自定义注解

自定义注解,我们来写注解。

自定义注解

自定义注解使用@interface,自动继承了java.lang.annotation.Annotation接口。

  • @interface用来声明一个注解,格式: public @interface 注解名{ 定义内容 }
  • 其中的每一个方法实际上声明了一个配置参数
  • 方法的名称就是参数的名称
  • 返回值类型就是参数类型(返回值只能是基本类型,class、string、enum)
  • 可以通过default来声明参数的默认值
  • 如果只有一个参数成员,一般参数名设为value(使用注解时可省略参数名value,其他的参数名不行)
  • 注解元素必须要有值,我们定义注解元素时,经常使用空字符串,0作为默认值

一般格式

关于自定义注解的元注解,建议:

  • @Target,作用域,设置可在类、方法上使用。@Target({ElementType.ANNOTATION_TYPE,ElementType.METHOD})
  • @Retention,注解保存级别,设置为RUNTIME。@Retention(RetentionPolicy.RUNTIME)

关于元注解@Target与@Retention,见这篇博客:传送门

1
2
3
4
5
@Target({ElementType.ANNOTATION_TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation2{

}

参数

正常情况

定义注解时定义了参数,使用时就需要给相应的参数不然就会报错(跟方法一样)。

  • 参数类型 + 参数名()

  • String name();

1
2
3
4
5
6
@Target({ElementType.ANNOTATION_TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation2{
//注解的参数:参数类型 + 参数名()
String name();
}

还能是数组:

1
2
3
4
5
6
7
8
9
10
@Target({ElementType.ANNOTATION_TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation3{
//注解的参数:参数类型 + 参数名()
String name() default "qsdbl";
int age();
int id() default -1;

String[] schools();
}

使用自定义注解:

  • 参数名 = 参数值

  • name = "hello"

1
2
3
4
5
6
//自定义注解
public class test03 {
@MyAnnotation2(name = "hello")
public void test(){
}
}

多个参数时,不需要考虑顺序。

1
2
3
4
5
6
7
//自定义注解
public class test03 {
@MyAnnotation3(schools = {"清华大学","北京大学"},age = 18)
public void test03(){

}
}

使用自定义注解时不给参数,会报错:

参数默认值

可以通过default来声明参数的默认值。String name() default "qsdbl";

默认值为“-1”,表示不存在。例如:int age() default -1;

1
2
3
4
5
6
@Target({ElementType.ANNOTATION_TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation2{
//注解的参数:参数类型 + 参数名()
String name() default "qsdbl";
}

使用:

使用时参数值可填可不填(有了默认值)。

1
2
3
4
5
6
//自定义注解
public class test03 {
@MyAnnotation2()
public void test(){
}
}

只有一个参数

如果只有一个参数成员,一般参数名设为value(使用注解时可省略参数名value,其他的参数名不行)

1
2
3
4
5
6
@Target({ElementType.ANNOTATION_TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation2{
//注解的参数:参数类型 + 参数名()
int value();
}

使用时,可省略参数名value

1
2
3
4
5
6
7
8
9
10
11
//自定义注解
public class test03 {
@MyAnnotation2(value = 1)
public void test01(){

}
@MyAnnotation2(1)
public void test02(){

}
}
若图片不能正常显示,请在浏览器中打开

欢迎关注我的其它发布渠道