1 package com.yubaby.annotation;
2
3 import com.yubaby.domain.Person;
4
5 /*
6 * 自定义注解
7 *
8 * 格式:
9 元注解
10 public @interface 注解名称{
11 属性列表;
12 }
13
14 * 本质:注解本质上就是一个接口,该接口默认继承Annotation接口
15 * public interface MyAnno extends java.lang.annotation.Annotation {}
16
17 * 属性:接口中的抽象方法
18 * 要求:
19 1. 属性的返回值类型有下列取值
20 * 基本数据类型
21 * String
22 * 枚举
23 * 注解
24 * 以上类型的数组
25
26 2. 定义了属性,在使用时需要给属性赋值
27 1. 如果定义属性时,使用default关键字给属性默认初始化值,则使用注解时,可以不进行属性的赋值。
28 2. 如果只有一个属性需要赋值,并且属性的名称是value,则value可以省略,直接定义值即可。
29 3. 数组赋值时,值使用{}包裹。如果数组中只有一个值,则{}可以省略
30
31 * 元注解:用于描述注解的注解
32 * @Target:描述注解能够作用的位置
33 * ElementType取值:
34 * TYPE:可以作用于类上
35 * METHOD:可以作用于方法上
36 * FIELD:可以作用于成员变量上
37 * @Retention:描述注解被保留的阶段
38 * @Retention(RetentionPolicy.RUNTIME):当前被描述的注解,会保留到class字节码文件中,并被JVM读取到
39 * @Documented:描述注解是否被抽取到api文档中
40 * @Inherited:描述注解是否被子类继承
41 */
42 public @interface MyAnno {
43
44 int value(); //基本数据类型
45 People peo(); //枚举
46 MyAnno2 an2(); //注解
47 String[] strArr(); //String数组
48
49 // void show(); //报错,不能是void
50 // Person per(); //报错,不能是类 类型
51 //返回值只能是上述5种
52 }
53
54 @interface MyAnno3{
55 int value();
56 }
57
58 @interface MyAnno4{
59 int age();
60 String name();
61 String sex() default "男男"; //
62 }
1 package com.yubaby.annotation;
2
3 /*
4 枚举类
5 */
6 public enum People {
7 P1, P2;
8 }
1 package com.yubaby.annotation;
2
3 @MyAnno(value = 11, peo = People.P1, an2 = @MyAnno2, strArr = {"111", "abc"})
4 @MyAnno4(age = 12, name = "tom") //若注解定义了属性,则在使用时必须给无默认值的属性赋值,不然使用类注解报错
5 @MyAnno3(666) //如果只有一个属性需要赋值,并且属性的名称是value,则value可以省略,直接定义值即可
6 @MyAnno5
7 public class Worker {
8
9 // @MyAnno5 //报错
10 // public String name;
11
12 /*@MyAnno5 //报错
13 public void show(){
14
15 }*/
16
17 }
1 package com.yubaby.annotation;
2
3 //此处虽然没有显示写明@MyAnno5注解,
4 // 但父类Worker类写明了@MyAnno5注解,
5 // 且自定义的@MyAnno5注解中写明了元注解@Inherited,即父类使用的注解会被子类继承
6 public class Teacher extends Worker{
7 }
1 package com.yubaby.annotation;
2
3 import java.lang.annotation.*;
4
5 /*
6 * 元注解:用于描述注解的注解
7 * @Target:描述注解能够作用的位置
8 * ElementType取值:
9 * TYPE:可以作用于类上
10 * METHOD:可以作用于方法上
11 * FIELD:可以作用于成员变量上
12 * @Retention:描述注解被保留的阶段
13 * @Retention(RetentionPolicy.RUNTIME):当前被描述的注解,会保留到class字节码文件中,并被JVM读取到
14 * @Documented:描述注解是否被抽取到api文档中
15 * @Inherited:描述注解是否被子类继承
16 */
17
18 @Target(value = {ElementType.TYPE}) //表明该MyAnno5注解只能作用于类上
19 // Target注解的value属性是一个数组,也可以添加其他取值,使MyAnno5注解可以作用于方法和成员变量上
20 // Target注解只有一个属性value需要进行赋值,所以可以省略,直接写@Target({ElementType.TYPE})
21 // 另外在本例中,因为value属性的值数组中仅设置了一个值,所以还可以省略,直接写@Target(ElementType.TYPE)也行
22 @Retention(RetentionPolicy.RUNTIME)
23 @Documented
24 @Inherited
25 public @interface MyAnno5 {
26 }