【Java基础】注解——自定义注解

这篇具有很好参考价值的文章主要介绍了【Java基础】注解——自定义注解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

什么是注解?

Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。 比如我们常见的@Override和@Deprecated都是注解,注解可以加在类、方法、成员变量等上面,类似于给他们“打标签"。

注解怎么定义?

public @interface 注解名{} 看起来和定义接口很相似只是多了一个@符号 接口: public interface 接口名 注解: public @interface 注解名

public @interface lkx {
    
}

注解怎么使用?

现在我们注解已经定义好了,使用的时候直接“@注解名”就可以使用了 比如下面我们可以定义在“类、成员变量、成员方法”上:

@lkx
public class Test {
    @lkx
    private int num;
    
    @lkx
    public static void main(String[] args) {
        System.out.println("hello");
    }
}
  • 思考一下

现在注解定义好也已经使用了,但是我不想定义到类上和成员方法上,只想定义在成员方法上,如何才能让注解只能定义到方法上,定义到别的地方报错呢? 想要的效果: java 自定义注解,Java基础,java,开发语言,spring

这个时候就要使用元注解来限定范围了。

元注解

元注解通俗的来说就是定义在注解上的注解,在Java中有四个元注解 @Target @Retention @Documented @Inherited

@Target

@Target就是用于描述注解的定义范围,可以限制这个注解定义的元素类型。

参数 作用
ElementType.ANNOTATION_TYPE 可以应用于注解类型
ElementType.CONSTRUCTOR 可以应用于构造函数
ElementType.FIELD 可以应用于字段或属性
ElementType.LOCAL_VARIABLE 可以应用于局部变量
ElementType.METHOD 可以应用于方法级注解
ElementType.PACKAGE 可以应用于包声明
ElementType.PARAMETER 可以应用于方法的参数
ElementType.TYPE 可以应用于类的任何元素

因为我们要限制只想定义在成员变量上,所以我们应该使用ElementType.FIELD

@Target(ElementType.FIELD)
public @interface lkx {

}

但是如果我们想同时定义在成员变量和成员方法上应该怎么办呢? 多个参数只需要用大括号包起来,逗号隔开就可以了

@Target({ElementType.FIELD,ElementType.METHOD})
public @interface lkx {

}

现在就只有定义在类上的注解报错了 java 自定义注解,Java基础,java,开发语言,spring

@Retention

@Retention是用于定义注解的生命周期,也可以理解为存储方式。

参数 作用
RetentionPolicy.SOURCE 标记的注解仅保留在源级别中,并被编译器忽略
RetentionPolicy.CLASS 标记的注解在编译时由编译器保留,但 Java 虚拟机(JVM)会忽略
RetentionPolicy.RUNTIME 标记的注解由 JVM 保留,因此运行时环境可以使用它

下面两个元注解使用不多,暂时不做详解

@Documented

@Documented是用于描述生成帮助文档时是否要保留其注解信息。

@Inherited

@Inherited是用于描述使被它修饰的注解是否具有继承性。

注解元素

上面我们只是定义了一个注解,但是不能传任何信息,只是相当于一个标签,现在我们看看要怎么给注解定义参数:

@Target({ElementType.FIELD,ElementType.METHOD})
@Retention(RetentionPolicy.SOURCE)
public @interface lkx {
    String name() default "张三"; //可以使用default定义默认的值
    int age();
}

现在我们看一下如何传参:

public class Test {

    //name有默认值,也可以不写
    @lkx(name = "李四",age = 18)
    private int num;
    
    public static void main(String[] args) {
        System.out.println("hello");
    }
}

实战

现在注解也定义好了,参数也传入了,你是否还在想注解有什么卵用。。。现在我们有个小需求,把注解传入的参数赋值到成员变量上。 例如:

@lkx(name = "李四",age = 18)
private int num; //num没有被赋值,等于0

赋值完成后
num = 18

注意事项:

  1. 下面代码需要用到反射,如果还不会的小伙伴可以看我前面几篇文章。
  2. 因为要用反射拿到注解参数,所以@Retention需要定义为RetentionPolicy.RUNTIME

实现代码:

@Target({ElementType.FIELD,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface lkx {
    String name() default "张三";
    int age();
}
java复制代码public class Test {

    //name有默认值,也可以不写
    @lkx(name = "李四",age = 18)
    private static int num;

    @lkx(name = "王五",age = 38)
    private static int age;

    public static void main(String[] args) throws InstantiationException, IllegalAccessException {
        System.out.println("赋值前: num: " + num+"   age: "+age);

        //拿到类的字节码
        Class<Test> testClass = Test.class;
        //拿到所有成员变量
        for (Field declaredField : testClass.getDeclaredFields()) {
            //检测成员变量上是否有@lkx注解
            if (declaredField.isAnnotationPresent(lkx.class)) {
                lkx annotation = declaredField.getAnnotation(lkx.class);
                //获取到注解中的age的值
                int age = annotation.age();
                declaredField.set(testClass.newInstance(),age);
            }
        }

        System.out.println("赋值后: num: " + num+"   age: "+age);
    }
}

运行结果:文章来源地址https://www.toymoban.com/news/detail-770837.html

java复制代码赋值前: num: 0   age: 0
赋值后: num: 18   age: 38

到了这里,关于【Java基础】注解——自定义注解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java|注解之定义注解

    Java语言使用 @interface 语法来定义注解( Annotation ),它的格式如下:  注解的参数类似无参数方法,可以用 default 设定一个默认值(强烈推荐)。最常用的参数应当命名为 value 。 元注解 有一些注解可以修饰其他注解,这些注解就称为元注解 (meta annotation)。Java标准库已经

    2024年02月05日
    浏览(36)
  • Java中的注解,自定义注解

    框架 = 注解 + 反射 + 设计模式 注解( Annotation )是从JDK5.0开始引入,以“@注解名”在代码中存在。 Annotation 可以像修饰符一样被使用,可用于修饰包、类、构造器、方法、成员变量、参数、局部变量的声明。还可以添加一些参数值,这些信息被保存在 Annotation 的 “name=valu

    2023年04月16日
    浏览(95)
  • 【Spring】Spring基础知识 Java开发必看

    🚀欢迎来到本文🚀 🍉个人简介:陈童学哦,目前专攻C/C++、Python、Java等方向,一个正在慢慢前行的普通人。 🏀系列专栏:陈童学的日记 💡其他专栏:C++STL、蓝桥杯,喜欢OJ的小伙伴可以看一手 🎁希望各位→点赞👍 + 收藏⭐️ + 留言📝 ​ ⛱️学习应使你快乐!望与诸君

    2024年02月13日
    浏览(33)
  • 【Java基础教程】(二十六)Java新特性篇 · 第六讲:注解——解码程序设计中的元数据利器,用小小的@符里做大大的开发~

    Java 注解(Annotation) 是Java语言中一种元数据形式,它提供了一种在代码中添加元数据的方式。注解为程序员提供了向代码中添加额外信息的能力,这些额外信息可以被编译器、工具或者运行时环境使用。 优点: 提供了一种 更加简洁和可读性强 的代码编写风格; 增强代码的

    2024年02月16日
    浏览(28)
  • java 元注解||自定义注解的使用

    1. @Retention注解 指定了标记的注解如何存储: RetentionPolicy.SOURCE,标记的注解仅保留在源代码级别,并被编译器忽略。 RetentionPolicy.CLASS,标记的注解在编译时由编译器保留,但被Java虚拟机(JVM)忽略。 RetentionPolicy.RUNTIME,标记的注解由JVM保留,以便运行时环境可以使用。 2. @Do

    2024年02月16日
    浏览(27)
  • Java企业级开发学习笔记(4.4)Spring Boot加载自定义配置文件

    创建 Spring Boot 项目 单击【创建】按钮 在 resources 里创建 myconfig.properties 文件 设置文件编码 设置学生的四个属性值 在 cn.kox.boot 包里创建config子包,在子包里创建 StudentConfig 打开自带的测试类 ConfigDemo01ApplicationTests 注入学生配置实体,创建 testStudentConfig() 测试方法,在里面输

    2024年02月08日
    浏览(37)
  • Java自定义注解

    目录 一、什么是自定义注解 1)Java注解简介 2)Java注解分类 JDK基本注解 JDK元注解 自定义注解 如何自定义注解? 二、自定义注解 1)获取类上注解值 2)获取类属性上的注解属性值 3)获取方法上的注解值  4)获取参数修饰注解对应的属性值 三、aop应用自定义注解 自定义注

    2024年02月19日
    浏览(27)
  • Java的自定义注解

            自定义注解包括注解声明、元注解、运行时处理器三个部分。注解声明指定了注解的名称、作用域、成员等信息;元注解则用来对注解进行修饰;运行时处理器则负责在程序运行过程中处理注解,并根据注解提供的信息执行相应的逻辑。自定义注解在编写框架、插

    2024年02月03日
    浏览(29)
  • Java中自定义注解

    当使用Java编写应用程序时,我们常常使用注解来为程序添加附加信息,并且可以在运行时读取这些注解。除了Java提供的预定义注解外,我们还可以自定义注解来满足自己的需求。在本文中,我们将介绍Java中自定义注解的基础知识。 一、什么是注解? 注解是一种元数据,可

    2024年02月14日
    浏览(30)
  • Java实现自定义注解

    (1)Java实现自定义注解其实很简单,跟类定义差不多,只是属性的定义可能跟我们平时定义的属性略有不同,这里会给大家详解,先来看代码: 上面代码就实现了一个 自定义注解 , 实现自定义注解需要最少指定 两个 基本条件 : ①注解的作用范围②注解的生命周期 ,那

    2023年04月19日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包