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.组合注解,未完待续......源码