JavaWeb1.3.2【基础加强:自定义注解(格式、本质、属性、元注解)】

 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 }

 

posted @ 2021-06-22 21:32  yub4by  阅读(46)  评论(0编辑  收藏  举报