• java-注解


    在Spring以及其他框架中注解使用很频繁,在框架中一个简单的注解就能完成很多事情。

    1、java注解分类:

    • 元注解:可以注解其它注解的注解,用于自定义注解
    • 自定义注解:可分为标记注解(没有元素的注解)和非标记注解
    • 第三方注解:比如spring的注解@Value等

    2、注解使用

    • 元注解:

    @Target 限定注解可以使用的地方

    @Retention 限定注解可以使用的级别

    @Inherited 如果自定义注解使用了该元注解注解,并自定义的注解使用于父类的类级别,那么子类的类级别也会继承该自定义注解

    @Document 生成文档使用

    • java提供的3个常用注解:

    @Override 表示当前方法覆盖了父类的方法,如果被覆盖但没有加该注解,编译器会提示错误

    @Deprecated 表示方法已经过时,在其它地方使用该方法,编译器会在方法名中间显示横线提示

    @SuppressWarnings  关闭不当的编译器警告

    • 自定义注解:
    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    @Inherited
    public @interface UseCase {
        int id();
        String desc() default "no desc";
    }
      • 使用了三个元注解,UseCase只能使用在运行级别使用在方法,如果@Target(ElementType.METHOD,ElementType.ClASS)注解一个类级别,那么@Inherited会起作用,子类会继承父类类级别的注解。
      • 继承中,如果父类的方法中有注解修饰,但是子类重写了父类的方法,则注解不会生效,除非调用的是父类的方法。
      • 注解中元素的约束:元素修饰符固定为public abstract,也可以缺省,但不能使用其他的修饰符;元素的使用的时候必须有值,要么使用默认值,要么赋值一个,当然也可以指定一个而不使用默认值。
    • 三方注解:略

    3、注解处理器

    注解如果单独存在,那么就没有意义了,需要搭配注解处理器,对注解进行处理。比如打印日志,自定义@PrintLog注解并编写注解处理器LogHandler,在spring中使用AOP面向切面编程配置注解处理器,即可打印日志。

    此处不涉及框架:应用自定义注解@UseCase

    package com.zhujie;
    
    public class PasswordUtils {
    
        @UseCase(id = 1)
        public boolean validPasswd(String passwd){
            return true;
        }
    
        @UseCase(id = 2,desc = "重置密码")
        public String resetPasswd(String passwd){
            return "123456";
        }
    }

    注解处理器+测试方法

    package com.zhujie;
    
    import java.lang.reflect.Method;
    
    public class AnnotationHandler {
    
        /**
         * 注解处理器方法
         * @param cl
         * @param methodName
         * @throws NoSuchMethodException
         */
        public static void handler(Class cl, String methodName) throws NoSuchMethodException {
            Method method=cl.getMethod(methodName, String.class);
            UseCase annotation=method.getAnnotation(UseCase.class);
            int id=annotation.id();
            String desc=annotation.desc();
            System.out.println("id为:"+id+"
    desc为:"+desc);
        }
    
        /**
         * 测试方法
         * @param args
         * @throws NoSuchMethodException
         */
        public static void main(String[] args) throws NoSuchMethodException {
    
            PasswordUtils passwordUtils=new PasswordUtils();
            passwordUtils.validPasswd("000000");
            handler(PasswordUtils.class, "validPasswd");
        }
    }

    输出结果

    id为:1
    desc为:no desc

    在注解处理器方法中使用了java的反射机制,这是不可避免的。

    4、反射:略

  • 相关阅读:
    关于影像颜色替换
    DevExpress TreeList控件的复选框
    深刻理解Vue中的组件
    【Vue】组件的基础与组件间通信
    vue语法糖
    vue中prop传值时加不加v-bind(冒号:)
    Vue从入门到实战
    vue-router实现原理
    Vue学习笔记——Vue-router
    Vue-router 学习笔记
  • 原文地址:https://www.cnblogs.com/shixiemayi/p/9384405.html
Copyright © 2020-2023  润新知