zoukankan      html  css  js  c++  java
  • Java自定义注解

    注解是Java5开始引入的一个概念;不是某一个框架特有的(我刚开始以为是Spring搞出来的-_-),为了搞清楚困扰自己多时的这个疑问,最近特地找了些资料并总结了一下供自己和有缘人翻阅学习;

    注解可以看作是一种特殊的标记,可以用在方法、类、参数和包上,程序在编译或者运行时可以检测到这些标记而进行一些特殊的处理,注解仅仅是一个标记;

    1. 定义注解

    • 修饰符:只能为public,不写时默认为public
    • 关键字:@interface
    • 注解名:自定义注解名 //如上:Info
    • 注解类型元素:注解重的内容 //如上:value, disabled
    public @interface Info {
        String value() default "";
        boolean disabled();
    }
    

    2. 修饰注解

    定义了一个注解之后,需要给这个自定义注解添加一定的描述,如:可以添加到类上或者方法上,编译期被丢弃呢还是一直存在等;这时需要用到java自带的一组注解:元注解,元注解一共四个

    2.1. Target

    描述注解可以修饰的Java元素类型,就是这个注解可以用在哪里,类上面还是方法上面或者参数前面

    Target类型 说明
    ElementType.TYPE 应用于类、接口(包括注解类型)、枚举
    ElementType.FIELD 应用于属性(包括枚举中的常量)
    ElementType.METHOD 应用于方法
    ElementType.PARAMETER 应用于方法的形参
    ElementType.CONSTRUCTOR 应用于构造函数
    ElementType.LOCAL_VARIABLE 应用于局部变量
    ElementType.ANNOTATION_TYPE 应用于注解类型
    ElementType.PACKAGE 应用于包
    ElementType.TYPE_PARAMETER 1.8版本新增,应用于类型变量
    ElementType.TYPE_USE 1.8版本新增,应用于任何使用类型的语句中(例如声明语句、泛型和强制转换语句中的类型)

    2.2. Retention

    描述注解的生命周期,就是这个注解啥时候失效,还是一直有效

    生命周期类型 说明
    RetentionPolicy.SOURCE 编译时被丢弃,不包含在类文件中
    RetentionPolicy.CLASS JVM加载时被丢弃,包含在类文件中,默认值
    RetentionPolicy.RUNTIME 由JVM 加载,包含在类文件中,在运行时可以被获取到

    2.3. Document

    描述该注解标记的元素可以被Javadoc 或类似的工具文档化

    2.4. Inherited

    描述使用了@Inherited注解的注解,所标记的类的子类也会拥有这个注解

    3. 案例

    自定义注解

    @Target({ElementType.TYPE, ElementType.METHOD}) // 可以在标记类或者方法
    @Retention(RetentionPolicy.RUNTIME) // 注解保留在程序运行期间,可以通过反射获得注解
    public @interface Info {
        String value() default "";
        boolean disabled();
    }
    

    创建实体类,使用注解

    //@Info(value="zhangsan") // 不写value时给所有String类型都设置
    @Info("zhangsan")
    public class User {
        private String name;
        private int age;
    }
    

    利用反射解析注解

    public static void main(String[] args) {
        try {
            //获取User的Class对象
            Class clazz = User.class;
            //判断person对象上是否有Info注解
            if (clazz.isAnnotationPresent(Info.class)) {
                System.out.println("User类上配置了Info注解!");
                //获取该对象上Info类型的注解
                Info infoAnno = (Info) clazz.getAnnotation(Info.class);
                System.out.println("user.value :" + infoAnno.value() + ", user.disabled:" + infoAnno.disabled());
            } else {
                //如果没有注解,或者@Retention(RetentionPolicy.CLASS) 或者@Retention(RetentionPolicy.RESOURCE) 会走这一步
                System.out.println("user类上没有配置Info注解!");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    

    输出结果

    User类上配置了Info注解!
    user.value :zhangsan, user.disabled:false
    

    定义了注解,且在代码中使用了,这时是给使用注解的代码添加了一个标记而已,这时没有任何实际意义,需要单独写代码来识别标记的代码并做处理,如上述代码通过反射获取使用Info注解的User类;
    _感谢阅读

  • 相关阅读:
    clickhouse-(04)-常用高阶函数
    clickhouse-(03)-库和表引擎
    clickhouse-(02)-适合的场景
    clickhouse-(01)-安装
    MySQL实战45讲-笔记
    Linux软连接和硬链接
    直接访问和间接访问
    指针和地址的区别
    配置Apache 运行CGI---------笔记
    配置Apache 运行CGI
  • 原文地址:https://www.cnblogs.com/dafengdeai/p/12350378.html
Copyright © 2011-2022 走看看