注解

编写注解

  • 定义

    • 四类原注解

      • @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();
            }
        }
    }
    

    输出:

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 什么是注解(Annotation):Annotation(注解)就是Java提供了一种元程序中的元素关联任何信息和...
    九尾喵的薛定谔阅读 3,206评论 0 2
  • 掌握的知识 : 基本用法、泛型擦除、泛型类/泛型方法/泛型接口、泛型关键字、反射泛型(案例) 泛型 概述 : 泛型...
    奋斗的老王阅读 1,689评论 0 49
  • 本文章涉及代码已放到github上annotation-study 1.Annotation为何而来 What:A...
    zlcook阅读 29,250评论 15 116
  • 在这里,我将写一些人的一些事,然后说出我的看法,权当心理分析的练习,欢迎大家一起讨论 莫文在一家IT公司工作已经一...
    烟雨云渊阅读 223评论 3 2
  • 请帖上写道:请罗瓦赛尔携夫人于18日晚8点来参加菲杰妮女士的生日宴会。 玛蒂尔德疑惑的盯着丈夫:这是谁?你们部门新...
    紫果冻阅读 235评论 0 0