注解

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

注解: 说明程序的,给计算机看的

注释: 用文字描述程序,给程序员看的

一、作用

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

二、jdk自带的几个注解

@Override:检查被该注解标注的方式是否是继承自父类【接口】

@Deprecated: 该注解表示注释的内容过时

@SuppressWarnings: 压制警告

//比如:Deprecated源码
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
public @interface Deprecated {
}

三、元注解

用于描述注解的注解

@Target:描述注解能够作用的位置
			ElementType取值:
			TYPE:可以作用于类上
			METHOD:可以作用于方法上
			FIELD:可以作用于成员变量上
@Retention:描述注解被保留的阶段
@Retention(RetentionPolicy.RUNTIME):当前被描述的注解,会保留到class字节码文件中,并被JVM读取到
@Documented:描述注解是否被抽取到api文档中
@Inherited:描述注解是否被子类继承

四、自定义注解

  • 格式
//这里写-元注解
public @interface 注解名称{
    // 属性列表
}
  • 本质

    反编译之后发现,注解的本质其实就是一个接口,继承Annotation父接口

    public @interface MyAnno {
    }
    
    // 找到class,cmd中javap反编译之后
    public interface com.laoyin.basic.base.MyAnno extends java.lang.annotation.Annotation {}
    
  • 属性

    • 返回结果必须是如下类型

    1.基本数据类型

    2.String类型

    3.枚举类型

    4.注解

    5.以上类型的数组

    • 注意

    1.如果定义的属性时,使用default关键字给属性默认初始值,可以在使用注解是不赋值

    2.如果只有一个属性需要赋值,而且该属性的名称是value,那么在赋值时 value可以省略

    3.数组赋值的时候,值使用{}包裹,如果数组中只有一个值,那么{}可以省略

五、案例

注解的使用,是通过反射获取其对象的属性值,然后调用的

/**
 * 自定义注解
 *     该注解表面要执行哪个类中的哪个方法
 */
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnno {

    String className();
    String methodName();
}

public class testEntity {
    public void show(){
        System.out.println("testEntity show ....");
    }
}

@MyAnno(className = "com.laoyin.testEntity",methodName = "show")
public class MyMain {

    public static void main(String[] args) throws Exception {
        // 获取类对象
        Class<MyMain> clazz = MyMain.class;
        // 获取类对象中的注解
        MyAnno an = clazz.getAnnotation(MyAnno.class);
        /**
         *  注解本质是 接口  获取到的其实是接口的实现
         *  public class MyInvokAnno implements InvokAnno{
         *
         *      String className(){
         *          return "com.gupao.edu.anno2.Student1";
         *      }
         *      String methodName(){
         *          return "show";
         *      }
         *  }
         */
        // 获取注解中对应的属性
        String className = an.className();
        String methodName = an.methodName();
        System.out.println(className);
        System.out.println(methodName);

        // 通过反射的方式实现接口的功能
        Class<?> aClass = Class.forName(className);
        Method show = aClass.getDeclaredMethod("show");
        // 方法的执行
        Object o = aClass.newInstance();
        show.invoke(o); // 执行对应的方法
    }
}
原文地址:https://www.cnblogs.com/laoyin666/p/14003131.html