zoukankan      html  css  js  c++  java
  • 注解

    注解(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); // 执行对应的方法
        }
    }
    
  • 相关阅读:
    bootstrap表格内容垂直居中
    [转]配置mysql允许远程连接的方法
    [转]MySQL服务器上添加一个允许远程访问的用户
    [转]Vs解决方案的目录结构设置和管理
    [转]win7下apache2.4响应很慢解决方法
    [转]js中获取时间的函数集
    [转]php和html混编的三种方式
    删除elasticsearch索引脚本
    socket传数据并记录到文件中
    记一次DDos攻击--2016/12/8
  • 原文地址:https://www.cnblogs.com/laoyin666/p/14003131.html
Copyright © 2011-2022 走看看