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 @   yub4by  阅读(47)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示