Java自定义注解

更新时间:2023-07-15 13:14:20 阅读: 评论:0

Java⾃定义注解
1.四个元注解解释
@Target 表⽰作⽤的范围
@Retention 表⽰⽣命周期范围
@Documented 表⽰注解能被javadoc解析,默认注解是不被javadoc解析的
@Inherited 表⽰被注解的类的⼦类能继承该注解。
过水鱼2.获取注解的⽅法(案例⽤了三个注解,更多注解百度查看API)
判断对象是否有这个注解isAnnotationPrent(Class<? extends Annotation> annotationClass)
获取对象的指定注解 getDeclaredAnnotation(Class<A> annotationClass)
获取对象所有的注解 getDeclaredAnnotations()
案例⼀:熟悉@Target、@Retention和上⾯三个⽅法
1package com.jtfr.demo1;
2
3import java.lang.annotation.ElementType;
4import java.lang.annotation.Retention;
5import java.lang.annotation.RetentionPolicy;
6import java.lang.annotation.Target;
7
8/**
9 * 学⽣名字注解
10 * @author陈康明 qq:1123181523
11 * @date 2019年2⽉27⽇
12*/
13// @Target 表⽰注解使⽤的位置(类、字段等区分)
夹一天不能掉晚上我检查视频
14// TYPE 表⽰作⽤在类、接⼝、注解、enum 上
15 @Target(ElementType.TYPE)
16// @Retention 表⽰注解⽣命周期
17// RUNTIME 表⽰在运⾏时期还有⽤,可以⽤于获取注解的值,同时RUNTIME也是⽣命周期最长的⼀个。
18 @Retention(RetentionPolicy.RUNTIME)
19public @interface StudentName {
20/**
21    * 给了 default 值,注解上去的时候,可以不需要写值了。
22    * @return
23*/
24    String name() default "";
25 }
1package com.jtfr.demo1;
2
3import java.lang.annotation.ElementType;
4import java.lang.annotation.Retention;
5import java.lang.annotation.RetentionPolicy;
6import java.lang.annotation.Target;
7
8/**
9 * 学⽣性别注解
10 * @author陈康明 qq:1123181523
11 * @date 2019年2⽉27⽇
12*/
13//@Target 表⽰注解使⽤的位置(类、字段等区分)
14//TYPE 表⽰作⽤在类、接⼝、注解、enum 上
15 @Target(ElementType.TYPE)
16//@Retention 表⽰注解⽣命周期
17//RUNTIME 表⽰在运⾏时期还有⽤,可以⽤于获取注解的值,同时RUNTIME也是⽣命周期最长的⼀个
18 @Retention(RetentionPolicy.RUNTIME)
19public @interface StudentSex {
20/**
21    * 性别只有男、⼥、不知道三种情况,所以⽤ enum 类型。
22*/
23public enum Sex{MAN, WOMAN, KNOW};
24/**
25    * 给了 default 值,注解上去的时候,可以不需要写值了。
26    * @return
27*/
28    Sex x() default Sex.KNOW;
29
30 }
泰德峰
1package com.jtfr.demo1;
2
3import java.lang.annotation.ElementType;
4import java.lang.annotation.Retention;
5import java.lang.annotation.RetentionPolicy;
6import java.lang.annotation.Target;
7/**
8 * ⽼师信息注解
9 * @author陈康明 qq:1123181523
10 * @date 2019年2⽉27⽇
11*/
12//@Target 表⽰注解使⽤的位置(类、字段等区分)
13//FIELD 表⽰作⽤字段上
14 @Target(ElementType.FIELD)
15//@Retention 表⽰注解⽣命周期
16//RUNTIME 表⽰在运⾏时期还有⽤,可以⽤于获取注解的值,同时RUNTIME也是⽣命周期最长的⼀个17 @Retention(RetentionPolicy.RUNTIME)
18public @interface TeacherInfo {
19
20/**
21    * 课程科⽬假设就两个,语⽂和数学,这样明确的个数⽤枚举表⽰。
22    * @return
23*/
24public enum Cour{LANGUAGE, MATHEMATICS};
25    Cour cour() default Cour.LANGUAGE;
26
27/**
28    * ⽼师年龄, ⼀般默认值,字符串⽤"", 数字⽤ -1 这样表⽰默认值,没有写
29*/
30int age() default -1;
31 }
1package com.jtfr.demo1;
2
3import com.jtfr.demo1.StudentSex.Sex;
4import com.jtfr.demo1.TeacherInfo.Cour;
5
6 @StudentName(name="钧天府⼈")
7 @StudentSex(x=Sex.MAN)
8public class Student {
9
10    @TeacherInfo(cour=Cour.LANGUAGE, age=18)
11private String teacher;
12 }
1package com.jtfr.demo1;
2
3import java.lang.annotation.Annotation;
4import flect.Field;
5
大数据挖掘
6/**
7 * 测试注解效果
8 * @author陈康明 qq:1123181523
9 * @date 2019年2⽉27⽇
10*/
11public class StudentTest {
12
13public static void main(String[] args) throws Exception{
14        Class<Student> cls = Student.class;
15// 判断类上是否有这个注解 isAnnotationPrent(Class<? extends Annotation> annotationClass) 16if (cls.isAnnotationPrent(StudentName.class)) {
17            System.out.println("包含 StudentName 注解");
18// 获取类上的指定注解 getDeclaredAnnotation(Class<A> annotationClass)
19            StudentName studentName = (StudentName) DeclaredAnnotation(StudentName.class);
20            System.out.println("输出注解信息:"+studentName);
21            System.out.println("姓名: "+studentName.name());
22        }
23        System.out.println("---------------------------------------");
24// 获取类上所有的注解 getDeclaredAnnotations()
25        Annotation[] annotations = DeclaredAnnotations();
26for (Annotation annotation : annotations) {
27            System.out.println("输出注解信息:"+annotation);
28// instanceof 可以直接判断被转成⽗类的变量是否是⼦类的实例
29if (annotation instanceof StudentName) {
30                System.out.println("姓名: "+((StudentName)annotation).name());
31            } el if(annotation instanceof StudentSex){
32                System.out.println("性别: "+((StudentSex)annotation).x());
33            }
34        }
35        System.out.println("---------------------------------------");
情趣用品促销
36        Field field = DeclaredField("teacher");
37// 判断字段上是否有这个注解isAnnotationPrent(Class<? extends Annotation> annotationClass) 38if (field.isAnnotationPrent(TeacherInfo.class)) {
39            System.out.println("包含 TeacherInfo 注解");
40// 字段获取指定注解和上⾯⼀样 getDeclaredAnnotation(Class<A> annotationClass)
41            TeacherInfo teacherInfo = DeclaredAnnotation(TeacherInfo.class);
42            System.out.println("输出注解信息:"+teacherInfo);
43            System.out.println("课程: "+ur());
44            System.out.println("年龄: "+teacherInfo.age());
45        }
46        System.out.println("---------------------------------------");
47// 获取字段上所有的注解和上⾯⼀样获取类上所有的注解 getDeclaredAnnotations()
48        Annotation[] declaredAnnotations = DeclaredAnnotations();
49for (Annotation annotation : declaredAnnotations) {
50// 知道这⾥只有⼀个注解那就判断⼀次就好了
51if (annotation instanceof TeacherInfo) {
关于雷锋的作文
52                TeacherInfo t = (TeacherInfo)annotation;
官场女人杨雪53                System.out.println("直接输出注解信息:"+t);
54                System.out.println("课程: "+t.cour());
55                System.out.println("年龄: "+t.age());
56            }
57        }
58    }
59 }
执⾏输出结果
案例⼆:@Inherited的使⽤
1package com.jtfr.demo2;
2
3import java.lang.annotation.Documented;
4import java.lang.annotation.ElementType;
5import java.lang.annotation.Inherited;
6import java.lang.annotation.Retention;
7import java.lang.annotation.RetentionPolicy;
8import java.lang.annotation.Target;
9
10// @Target 表⽰注解使⽤的位置(类、字段等区分)
11// TYPE 表⽰作⽤在类、接⼝、注解、enum 上
12 @Target(ElementType.TYPE)
13// @Retention 表⽰注解⽣命周期
14// RUNTIME 表⽰在运⾏时期还有⽤,可以⽤于获取注解的值,同时 RUNTIME 也是⽣命周期最长的⼀个。
15 @Retention(RetentionPolicy.RUNTIME)
16// @Documented 表⽰注解能被 javadoc 解析,默认注解是不被 javadoc 解析的
17 @Documented
18// @Inherited 表⽰被注解的类的⼦类能继承该注解。
19 @Inherited // 如果注释了 B 就获取不到注解了。可以⾃⼰注释测试看⼀下结果
20public @interface InheritedTest {
21
22    String value() default "";
23 }
1package com.jtfr.demo2;
2
3 @InheritedTest("可以被⼦类获取到")
4public class A {
5
6 }
1package com.jtfr.demo2;
2
3public class B extends A {
4
5 }
1package com.jtfr.demo2;
2
3/**
4 * 测试 @Inherited 注解效果
5 * @author陈康明 qq:1123181523
6 * @date 2019年2⽉27⽇
7*/
鹊桥仙七夕8public class MainTest {
9
10public static void main(String[] args) {
11        Class<B> cls = B.class;
12if (cls.isAnnotationPrent(InheritedTest.class)) {
13            System.out.println("获取到了⽗类上的注解");
14            System.out.Annotation(InheritedTest.class).value());
15        }
16    }
17 }
执⾏输出结果
3.组合注解,未完待续......源码

本文发布于:2023-07-15 13:14:20,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1097915.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:注解   获取   字段   输出   转成
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图