Java基础--注解

来源:互联网 发布:淘宝打造爆款团队 编辑:程序博客网 时间:2024/06/06 12:37

一、 什么是注解

定义:注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。通俗地讲,就是符合一定格式的语法。

作用
①编写文档:通过代码里标识的元数据生成文档【生成文档doc文档】
②代码分析:通过代码里标识的元数据对代码进行分析【使用反射】
③编译检查:通过代码里标识的元数据让编译器能够实现基本的编译检查【Override】
目前最主流的应用是代替配置文件。

优缺点
开发效率高,成本低;
耦合性大,并且不利于后期维护。


二、基本内置注解
1. @Override
帮助开发人员检查是否正确覆盖了父类方法。JDK5表示覆写父类的方法,JDK6还可以表示实现接口的方法。
2. @Deprecated
表示被修饰的方法已经过时。过时的方法不建议使用,但仍可以使用。
注:一般被标记过时的方法都存在不同的缺陷:安全问题、新的API取代。
3. @SuppressWarnings
表示抑制警告,被修饰的类或方法如果存在编译警告,将被编译器忽略。
deprecation 忽略过时
rawtypes 忽略类型安全
unused 忽略不使用
unchecked 忽略安全检查
null 忽略空指针
all 忽略所有


三、自定义注解

public @interface MyAnno{    //注解的属性    String value();}

注解内的属性类型只有以下几种:
String、基本类型、枚举类型、注解类型、Class类型、以上类型的一维数组类型

注解使用的注意事项:
(1)注解可以没有属性,如果有属性,需要使用小括号括住。如:@MyAnno @MyAnno()
(2)属性格式:属性名=属性值,多个属性使用逗号分隔。如@MyAnno(name=”ztq”, age=”18”)
(3)如果属性名为value,且当前只有一个属性,那么value可以省略
(4)如果使用多个属性时,k的名称为value不能省略
(5)如果属性类型为数组,设置内容格式为{1, 2, 3}。如:@MyAnno(arrs = {“lisa”, “Jack”})
(6)如果属性类型为数组,且元素只有一个时,{}可以省略
(7)一个对象上,注解只能使用一次,不能重复使用。

给类、方法等添加注解,如果需要在获得注解上设置的数据,那么我们就必须对注解进行解析,JDK提供java.lang.reflect.AnnotatedElement接口,允许在运行时通过反射获得注解。

元注解:用于修饰注解的注解。(用于修饰自定义注解的JDK提供的注解)
JDK提供4种元注解:
(1)@Retention 用于确定被修饰的自定义注解的生命周期

  • RetentionPolicy.SOURCE 被修饰的注解只能存在源码中,字节码class没有。用途:提供给编译器使用。
  • RetentionPolicy.CLASS被修饰的注解只能存在于源码和字节码中,运行时内存中没有。用途:JVM使用。
  • RetentionPolicy.RUNTIME被修饰的注解存在于源码、字节码、内存(运行时)中。用途:取代xml配置

(2)@Target 用于确定被修饰的自定义注解的使用位置

  • ElementType.TYPE 修饰类、接口
  • ElementType.CONSTRUCTOR 修饰构造
  • ElementType.METHOD 修饰方法
  • ElementType.FIELD 修饰字段

(3)@Documented 使用JavaDoc生成API文档时,包含此注解。
(4)@Inherited 如果父类使用被修饰的注解,子类继承。


定义注解:

@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface MyAnno {    String name();    int age() default 18;}

使用注解:

public class MyAnnoTest {    @MyAnno(name = "ztq")    public void show(){        System.out.println("show running!");    }}

解析注解:

public class MyAnnoParser {    public static void main(String[] args) {        /*        解析show方法上面的@MyAnno        主要目的就是获得show方法上的@MyAnno中的参数         */        //获得show方法的字节码对象        Class clazz = MyAnnoTest.class;        try {            Method method = clazz.getMethod("show", null);            //获得show方法上的@MyAnno            MyAnno annotation = method.getAnnotation(MyAnno.class);            //获得注解的属性值            System.out.println(annotation.name());  //ztq            System.out.println(annotation.age());  //18        } catch (NoSuchMethodException e) {            e.printStackTrace();        }    }}