介绍
1、注解,或者叫做注释,英文单词是Annotation
2、注解Annotation是一种引用数据类型。编译之后也是生成字节码文件
3、语法格式
[修饰符列表] @interface 注解类型名{
}
4、注解怎么使用,用在什么地方?
(1)默认情况下,可放在任何位置
5、jdk5.0之后的功能
元注解
1、注解的注解称为【元注解】
2、常见的:Target,Retention
Target注解
1、用来标注“被标注的注解”可以出现在哪些位置上
Retention注解
1、用来标注“被标注的注解”最终保存到哪里
@Retention(RetentionPolicy.SOURCE):表示该注解只被保留在Java源文件中
@Retention(RetentionPolicy.CLASS):表示该注解被保留在class文件中
@Retention(RetentionPolicy.RUNTIME):表示该注解被保存在class文件中,并且可以被放射机制所读取
@override【标志性注解】
1、这个注解只能注解方法
2、这个注解是给编译器参考的,和运行阶段无关
3、凡是java中的方法带有这个注解的,编译器都会进行编译检查,如果这个方法不是重写父类的方法,编译器报错
@Deprecated注解
1、表示“被注解的类”已过时
注解中定义属性
1、注解内代码
public @interface MyAnotation { // 以下是MyAnotation的name属性 // 看着像1个方法,但实际上我们称之为属性 String name(); String color(); // 属性指定默认值 int age() default 25; }
2、使用自定义注解
public class Test { // @MyAnotation(属性名=属性值) // 指定name属性的值就好了 // 如果一个注解当中有属性,一定要给属性值赋值(除非该属性有默认值) @MyAnotation(name = "zhangsan", color = "红色") public void doSome(){ } }
3、如果注解的一个属性是value,且只有一个属性,可以省略写,例:@MyAnotation("")【一般开发过程用不到,源代码中会出现】
4、注解中的属性可以是哪些类型?
(1)byte short int long float double boolean char String Class 枚举类型
(2)以及以上每一种类型的数组形式
public @interface MyAnotation { // 以下是MyAnotation的name属性 // 看着像1个方法,但实际上我们称之为属性 String[] name(); }
// 如果属性是数组,要加大括号,但是如果属性值只有一个,可以不加 @MyAnotation(name = {"zhangsan", "lisi"}) public void doSome(){ }@MyAnotation(name = "zhangsan") public void otherSome(){ }
通过反射获取注解对象属性的值
1、获取类上的注解
(1)待获取的类
@MyAnotation(name = "zhangsan", color = "红色") public class ReflectTest { public void doSome(){ } }
(2) 代码实现
public static void main(String[] args) throws ClassNotFoundException { // 获取这个类 Class c = Class.forName("Annotation.AnnotationTest01.ReflectTest"); // 判断这个类上是否有注解 if(c.isAnnotationPresent(MyAnotation.class)){ // 获取该注解对象 MyAnotation myAnotation = (MyAnotation) c.getAnnotation(MyAnotation.class); // 获取注解对象的属性值 System.out.println(myAnotation.name()); } }