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 }