注解

作者: 蕊er | 来源:发表于2017-11-01 10:22 被阅读0次

编写注解

  • 定义

    • 四类原注解

      • @Retention

        ​ SOURCE:源码注解,只在源码中存在,编译成.class文件就不存在了

        ​ CLASS:编译时注解,注解在字节码文件级别可见,在源码和.class文件中都存在

        ​ RUNTIME:运行时注解,注解在整个运行阶段都可见

      • @Target 代表注解修饰的范围:类上使用,方法上使用,字段上使用

        ​ CONSTRUCTOR(构造方法声明),FIELD(字段声明),LOCAL VARIABLE(局部变量声明),METHOD(方法声明),PACKAGE(包声明),PARAMETER(参数声明),TYPE(类接口)

      • @Documented

        生成javadoc时会包含注解

      • @Inherited

        一个标识性的元注解,它允许子注解继承它

    • 关键字@interface

    • 属性 返回值类型 属性名() [default 默认值]

      • 返回值类型:基本类型,String,Class,注解,枚举以及以上类型的一维数组
      • 如果属性的名字是value,并且注解的属性值有一个 那么在使用注解时可以省略value
  • 使用

    • 注解可以没有属性,如果有属性需要使用小括号括住,例如@Annotation@Annotation(key=value)
    • 属性格式:属性名=属性值,多个属性用逗号隔开
    • 如果属性名为value,且当前只有一个属性,value可以忽略
    • 使用多个属性时,key的值为value不可省略
    • 如果属性类型为数组,设置内容格式为:{1,2,3},例如attrs={a,b}
    • 如果属性类型为数组,值只有一个,{}可以忽略,例如attres=a
    • 一个对象上,注解只能使用一次,不能重复
  • 解析

    @Target({ElementType.FIELD,ElementType.METHOD,ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface Desc {
        String value() default "helloword";
    }
    
    @Desc("这是一个类,创建人员对象")
    public class Persion {
        @Desc("这是一个属性,描述人名")
        private String name;
    
        public String getName() {
            return name;
        }
    
        @Desc("这是一个方法用来设置用户名")
        public void setName(String name) {
            this.name = name;
        }
    }
    
    @WebServlet(name = "AnnotationServlet")
    public class AnnotationServlet extends HttpServlet {
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }
    
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            try {
                Class clazz = Class.forName("com.learn.annotation.Persion");
                if (clazz.isAnnotationPresent(Desc.class)) {
                    Desc desc = (Desc) clazz.getAnnotation(Desc.class);
                    System.out.println(desc.value());
                }
                Field field = clazz.getDeclaredField("name");
                //setAccessible
                if (field.isAnnotationPresent(Desc.class)) {
                    Desc desc = (Desc) field.getAnnotation(Desc.class);
                    System.out.println(desc.value());
                }
                Method method = clazz.getMethod("setName", String.class);
                if (method.isAnnotationPresent(Desc.class)) {
                    Desc desc = (Desc) method.getAnnotation(Desc.class);
                    System.out.println(desc.value());
                }
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (NoSuchFieldException e) {
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            }
        }
    }
    

    输出:

    ​ 这是一个类,创建人员对象
    ​ 这是一个属性,描述人名
    ​ 这是一个方法用来设置用户名

相关文章

  • 注解学习笔记

    什么是注解注解分类注解作用分类 元注解 Java内置注解 自定义注解自定义注解实现及使用编译时注解注解处理器注解处...

  • 注解与反射

    注解 声明一个注解类型 元注解 在定义注解时,注解类也能够使用其他的注解声明。对注解类型进行注解的注解类,我们称之...

  • 1.8 Java 注解annotation

    1.1 注解声明 Java注解Annotation,有声明注解和元注解 元注解:Java提供的元注解,所谓元注解就...

  • 注解的使用

    元注解 注解 注解本质就是接口: 元注解:修饰注解的注解 自定义注解 Text.java FruitName.ja...

  • 注解

    Java注解 注解 元注解 自定义注解 元注解:负责注解其他注解 共有4个标准的meta-annotation类型...

  • Spring高级应用之组合注解和元注解

    1.核心概念: 元注解:可以注解在其他注解上的注解;被注解的注解成为组合注解; 2.组合注解的定义步骤 定义组合注...

  • 2016.10.13-关于注解的自定义和注解的解析

    注解可以分为:1、标识性注解(没有成员变量) 2、注解 3、元注解(注解的注解) 1、注解的自定义 自定义注解的格...

  • 自定义注解

    注解分类 1、代码注解2、编译时注解3、运行时注解 注解范例 使用注解的类 注解解析类 注解实战 需求1、有一张用...

  • 【JAVA】注解

    元注解 用来定义、声明注解的注解。 @Inherited注解 使用此注解声明出来的自定义注解,在使用此自定义注解时...

  • Spring Boot常用注解

    注解速览 配置加载相关 Bean 声明注解 Bean 注入注解 SpringMVC 注解 MyBatis 注解 配...

网友评论

      本文标题:注解

      本文链接:https://www.haomeiwen.com/subject/ccuwpxtx.html