Java Annotation

概念

  1. 给计算机看
  2. 作用
    • 形成文档
    • 程序处理
    • 编译检查

内置注解

  1. @Overide
  2. @Deprecated
  3. @SuppressWarning @SuppressWarning("all")

自定义注解

  1. 格式
    1. 元注解
    2. public @interface annotation-name {}
  2. 本质:是一个接口,继承Annotation接口
    1. public interface MyAnno extends java.annotation.Annotation{}
  3. 属性:相当于接口中的抽象方法
    1. 要求
      1. 属性的返回值类型
        • 基本类型
        • String
        • 枚举
        • 注解
        • 以上类型的数组
      2. 注解使用时属性必须复制,
        1. 可用default为属性赋默认值 String name() default "zhangsan"
        2. 如果只有一个属性需要赋值,且名称为value,可以直接赋值
        3. 数组赋值:如果数组中只有一个数组可以直接写,否则用{}
        4. 注解赋值: @注解名
  4. 元注解
    • 描述注解的注解
    • @Target:描述注解能够作用的位置
      • ElementType.TYPE
      • ElementType.METHOD
      • ElementType.FIELD
    • @Retentation:注解保留阶段
      • RetentionPolicy.RUNTIME: 被描述的注解保留在字节码文件中,JVM会读到被描述的注解。
      • RetentionPolicy.CLASS: 被描述的注解保留在字节码文件中。
      • RetentionPolicy.SOURCE,: Annotations are to be discarded by the compiler.。
    • @Document:是否被javaDoc
    • @Inherited: 被描述的注解会自动带到子类
  5. 注解的解析
    1. 获取该类的字节码文件
      Class reflectTest = ReflectTest.class

    2. 获取上边的注解对象
      Pro an =reflectTest.getAnnotation(Pro.class);
      其实就是在内存中生成了一个该注解接口的子类实现对象

            public class ProImpl implements Pro {
            public String className() {
              return "my.app"
            }
            public String methodName (){
              return "methodName"
            }
          }
      
    3. 用注解对象中的抽象方法,获取返回值
      String className = an.className()

自定义注解实例

  1. 定义注解
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.METHOD)
    public @interface Check {
    }
    
  2. 使用注解
    public class Calculator {
        @Check
        public void add() {
            System.out.println(String.format("The result is %d",(1+2)));
        }
        @Check
        public void sub() {
            System.out.println(String.format("The result is %d",(1 - 2)));
        }
        @Check
        public void mul() {
            System.out.println(String.format("The result is %d",(1 * 2)));
        }
         @Check
         public void div() {
        System.out.println(
    String.format("The result is %d",(1 / 0)));
        }
    }
    
  3. 注解解析
    public class CheckHandler {
        public static void main(String[] args) {
            Calculator cal = new Calculator();
            Class calClass = cal.getClass();
            Method[] methods = calClass.getMethods();
            Arrays.asList(methods).stream()
                    .filter(mth -> mth.isAnnotationPresent(Check.class))
                    .forEach(mth -> {
                        try {
                            mth.invoke(cal);
                        } catch (Exception e) {                       
             System.out.println(e.getCause().getClass().getSimpleName());
                        System.out.println(e.getCause().getMessage());
                    }
                });
        }
    }
    

你可能感兴趣的:(Java Annotation)