注解

mac2022-06-30  21

注释:

对程序进行解释说明的文字,给人看的

什么是注解? Annotation JDK1.5推出的新特性

可能给类增加额外的信息 注解可以保存一些简单的数据

注解的作用:

编写文档:通过代码里标识的注解生成文档【生成文档doc文档】编译检查:通过代码里标识的注解让编译器能够实现基本的编译检查【Override】代码分析:通过代码里标识的注解对代码进行分析【使用反射】

今天学注解的重点:

1.使用注解保存一些数据 2.通过代码得到注解中的数据

自定义注解

1.自定义注解的格式:

@interface 注解名 { // 注解的属性 数据类型 变量名(); }

注解的属性类型

1.基本数据类型的8种 2.String,枚举,注解,Class 3.以上类型的一维数组 注意:自定义的类型不行

使用自定义注解格式:

@注解名(属性名=属性值, 属性名=属性值) 注意:注解的每个属性都要赋值 注解:可以有默认值

@MyAnno2(price = 6.66, name = "西游记") public class Demo112 { @MyAnno2(name = "西游记") public static void main(String[] args) { } } public @interface MyAnno2 { String name(); double price() default 8.88; } // 空注解 public @interface MyAnno1 { }

自定义注解的特殊情况?

当注解中只有一个属性,并且属性名是value,在使用注解时,可以省略value属性名 注解中有多个属性,多个属性都有默认值,value属性名可以省略

public @interface MyAnno3 { String value(); double price() default 1.1; double height() default 166; }

元注解

1.什么是元注解?

修饰注解的注解

@Target(ElementType.METHOD) @Retention(RetentionPolicy.SOURCE) public @interface Override { }

2.@Target元注解:

默认注解可以放在所有位置 限制注解使用的位置

3.@Retention元注解:

默认是存活到CLASS阶段,限制注解能够存活到什么时候

SOURCE CLASS RUNTIME *.java -> *.class -> 运行 // @Target(ElementType.TYPE) // 注解只能放在类和接口上 // @Target(ElementType.FIELD) // 注解只能放在成员变量上 // @Target(ElementType.CONSTRUCTOR) // 注解只能放在成员变量上 // @Target(ElementType.METHOD) // 注解只能放在成员方法上 // @Target(ElementType.LOCAL_VARIABLE) // 注解只能放在局部变量上 // @Target({ElementType.METHOD, ElementType.LOCAL_VARIABLE}) // 注解放在多个位置上 @Retention(RetentionPolicy.RUNTIME) public @interface MyAnno4 { } @MyAnno4 public class Demo13 { @MyAnno4 int a = 10; @MyAnno4 public Demo13() { } @MyAnno4 public static void main(String[] args) { @MyAnno4 int x = 20; } @MyAnno4 public void show() { } }

注解解析

什么是注解解析?

得到注解中的属性数据

注解解析相关接口?

AnnotatedElement接口定义了解析注解的方法 T getAnnotation​(Class annotationClass) 获取指定类型的注解

Annotation[] getAnnotations​() 获取所有注解boolean isAnnotationPresent​(Class annotationClass) 判断是否有指定的注解实现类: Class, Constructor, Field, Method

如何解析注解?

注解在谁头上就用谁来获取注解在构造方法上,使用Constructor来获取注解在成员方法上,使用Method来获取注解在成员变量上,使用Field来获取 // 我们点左边绿色的三角形,程序就运行起来的. public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException { // 解析注解,得到属性的属性 // 注解在谁头上就用谁来获取: 注解在成员方法上,使用Method来获取 Class<?> cls = Class.forName("com.itheima.demo14注解解析_练习.Book"); Method m1 = cls.getMethod("sale"); // 获取所有的注解 Annotation[] as = m1.getAnnotations(); for (Annotation a : as) { System.out.println("a = " + a); } System.out.println("-------"); // 最好先判断,再获取 // boolean isAnnotationPresent​(Class<Annotation> annotationClass) 判断是否有指定的注解 boolean b = m1.isAnnotationPresent(BookAnno.class); System.out.println("b = " + b); if (b) { // T getAnnotation​(Class<T> annotationClass) 获取指定类型的注解 BookAnno an = m1.getAnnotation(BookAnno.class); System.out.println(an.name()); // 西游记 System.out.println(an.price()); // 9.9 } else { System.out.println("没有这个注解"); } }
最新回复(0)