Java基础(11)-----注解

标签: java  annotation  se  reflect

思维导图

 

  1. 首先,注解存在的意义就是在为了在以后的某个时间获得注解所提供的信息.
  2. 其次,注解是不可继承的.(一个注解不能继承另一个注解)

一.注解的分类

在java中,注解可以分类3类

  • 内置注解:这是java.lang提供的注解,功能有限
  • 元注解:注解的注解,利用他们以构造新的注解
  • 新注解:我们自己构建的注解,可以提供我们自定义的需要的信息

1.1内置注解

  • @override,表示此方法时重写的方法,如果代码不合规范则报错
  • @Depracated,表示此方法已废弃,不建议使用
  •  
  • @SuppressWarnings,使用此注解可以忽略下方的提示信息.unchecked使我们忽略警告信息,serial忽略序列化UID的提示,deprecation忽略方法已废弃的信息
//其参数value是一个数组,当注解中只有value属性需要输入值的时候可以直接写值不写value=???
    @SuppressWarnings({"deprecation","seril","unchecked"})

1.2元注解

  • @Documented,javadoc工具默认情况下不会生成关于注解的信息,使用了@Documented后则会生成相关信息
  • @Inherited,如果此注解注解了一个类,那么这个类的子类会继承父类的注解的信息
  • @Target,指定此注解注解的注解会用在哪里
  • @Retention,此注解的留存级别
  • //此注解将会被文档记录
    @Documented
    //此注解所注解的类被继承时,会继承此注解
    @Inherited
    //Target的值也是数组,可以指定java文件的任意一种成员,如果不指定,则默认为所有值
    @Target({ElementType.ANNOTATION_TYPE,ElementType.FIELD})
    //表示此注解保留的级别,
    // RetentionPolicy.SOURCE是源码级别,class文件中就没有了
    //RetentionPolicy.CLASS是class文件级别,VM即虚拟中没有
    //RetentionPolicy.RUNTIME是运行时级别,信息会被加载到JVM中.运行时可用
    @Retention(RetentionPolicy.RUNTIME)
    @interface TestAnno{}

    1.3自定义注解

创建一个自定义的注解需要指定其元注解,还要指定其元素,即此注解要保留什么信息,如果什么信息都没有,就称为标记注解

注解保留信息的种类可以是

  • 基本类型
  • String
  • enum
  • Class对象
  • Annotation,所以一个注解是可以包含另一个注解的信息的
  • 以上信息的数组
  • //输入的数据必须有确定的值才行
    //@TestAnno(names=new String[1])
    @TestAnno(names = {"x","skd"})
    public class AnnotationDemo {
        public void testInnerAnnotation(){
    
        }
    }
    //此注解将会被文档记录
    @Documented
    //此注解所注解的类被继承时,会继承此注解
    @Inherited
    //Target的值也是数组,可以指定java文件的任意一种成员,如果不指定,则默认为所有值
    @Target({ElementType.TYPE,ElementType.METHOD})
    //表示此注解保留的级别,
    // RetentionPolicy.SOURCE是源码级别,class文件中就没有了
    //RetentionPolicy.CLASS是class文件级别,VM即虚拟中没有
    //RetentionPolicy.RUNTIME是运行时级别,信息会被加载到JVM中.运行时可用
    @Retention(RetentionPolicy.RUNTIME)
    @interface TestAnno{
        //如果使用此注解是可以只输入value的值,那么value就可以省略掉
        public int value() default 1;
        //如果不指定信息的默认值,那么使用注解的时候就必须输入值
        public String name() default "xiaohao";
        //可以是其他的注解
        public TestAnno2 otherAnno() default @TestAnno2;
        //还可以是允许类型的数组,没有指定默认值,所以使用时必须输入一个数组,而且不能简写
        public String[] names();
    
    }
    @interface TestAnno2{}

    二.获得注解信息

以上都只是创建注解,创建注解的目的是为了获得注解的信息,在javase中,获得其信息的方式是利用java的反射

@TestAnno(names = {"x","skd"})
public class AnnotationDemo {
    public static void main(String[] args){
        userAnno(new AnnotationDemo());
    }
    public static void userAnno(Object object){
        Annotation[] annotations = new Annotation[10];
        //利用反射获得注解
        annotations = object.getClass().getDeclaredAnnotations();
        //先确认注解类型
        if(annotations[0] instanceof TestAnno){
            //在获得注解的信息,并作出相应的处理
            TestAnno ta = (TestAnno)annotations[0];
            System.out.println(ta.name());
            System.out.println(ta.value());
            System.out.println(ta.otherAnno());
            System.out.println(Arrays.asList(ta.names()));
        }
    }
}

/*xiaohao
1
@annotationdemo.TestAnno2()
[x, skd]*/

 

原文链接:加载失败,请重新获取