package com.javase.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * 关于注解: * 注解也叫注释类型,英文单词是:Annotation * * 注解Annotation是一种引用数据类型,编译之后也是生成 *.class文件。 * * 自定义注解的语法格式: * [修饰符列表] @interface 注解类型名{ * * } * * 注解的使用: * 第一:注解使用时的语法格式: @注解类型名 * 第二:注解可以出现在类上、属性上、实例方法上、静态方法上、构造方法上、变量上、 * 接口上、枚举类型上、形参上...... 注解还可以出现在注解类型上。 * * JDK内置了哪些注解呢? * java.lang包下的注解类型: * Deprecated:用 @Deprecated 注释的程序元素,不鼓励程序员使用这样的元素,通常是因为它很危险 * 或存在更好的选择。在使用不被赞成的程序元素或在不被赞成的代码中执行时,编译器会发出警告。 * * Override:用 @Override注释的表示一个方法声明打算重写超类中的另一个方法声明。 * 凡是java中的方法带有这个注解的,编译器都会进行编译检查,如果这个方法不是重写父类的方法,编译器报错。 * 该注解只是在编译阶段起作用,和运行阶段无关。 * * 元注解: * 什么是元注解? 用来标注“注解类型”的“注解”,称为元注解。 * * 常见的元注解有哪些? Target Retention * * 关于Target注解:这是一个元注解,用来标注“注解类型”的注解,用Target注解来标注“被标注的注解”可以出现在哪些位置上。 * @Target(ElementType.METHOD): 表示“被标注的注解”只能出现在方法上。 * @Target(ElementType.CONSTRUCTOR): 表示“被标注的注解”只能出现在构造方法上 * @Target(ElementType.FIELD): 表示“被标注的注解”只能出现在属性上 * @Target(ElementType.PACKAGE): 表示“被标注的注解”只能出现在包上 * @Target(ElementType.TYPE): 表示“被标注的注解”只能出现在类上 * ...... * * * 关于Retention注解: 这是一个元注解,用来标注“注解类型”的注解,这个Retention注解用来标注“被标注的注解”最终保留在哪里。 * @Retention(RetentionPolicy.SOURCE): 表示“被标注的注解”只被保留在java源文件中。 * @Retention(RetentionPolicy.CLASS): 表示“被标注的注解”被保存在class文件中。 * @Retention(RetentionPolicy.RUNTIME): 表示“被标注的注解”被保存在class文件中,并且可以被反射机制所读取。 */ @Target({ElementType.TYPE,ElementType.METHOD})//该注解是元注解,该注解的属性value被省略了,该注解表示被 // 它标注的@MyAnnotation01注解只能出现在类上、方法上。 @Retention(RetentionPolicy.RUNTIME)//该注解也是元注解,该注解的属性value也被省略了,该注解表示被它标注的 // 注解@MyAnnotation01注解会保存在class文件中,并且可以被反射机制获取到。 public @interface MyAnnotation01 { // 指定一个name属性 String name();//这行代码表示注解中的属性,看起来好像方法,但实际上是注解中的属性 // 指定一个value属性 String value() default "河北省秦皇岛市";//表示属性value的默认值是"河北省秦皇岛市" }
package com.javase.annotation; public @interface MyAnnotation02 { // 指定一个value属性 String value(); }
package com.javase.annotation; /** * 使用注解: * 如果注解中有属性,那么在使用的时候需要对属性赋值,不然就会报错 * 赋值方法: * @注解名(注解属性名=属性值,注解属性名=属性值,......) * * 如果注解的属性名是:value,并且只有这一个属性,那么属性名可以省略,这里仅仅是value可以省略,其它名称都不可以省略。 * * 注解中属性的类型可以是哪些呢? * 可以是:byte、short、int、long、float、double、boolean、char、String、enum(枚举类型)、Class * 以及以上每一种类型的数组形式。 * * 如果属性的类型是数组的形式,那么属性值就要放到{}中,如果{}中只有一个值,那么{}可以省略。 * */ public class AnnotationText01 { public static void main(String[] args) { } @MyAnnotation01(name = "zhangsan",value = "123")//这里的属性名除了value还有name,所以value不能省略 public void doSome(){ } @MyAnnotation01(name="王五")//如果某个属性有默认值,那么这个属性值可以省略不写(value属性有默认值,这里省略了) public void b(){ } @MyAnnotation02("abc")//因为这里的属性名只有一个value,所以属性名value可以省略 public void doOther(){ } @MyAnnotation02(value = "haha")//不省略也可以 public static void aVoid(){ } }