Java实现自定义注解

简介: 笔记

前言


自定义注解也是一道经常会被问道的面试题.通常会问你自己用过自定义注解吗,让你简单描述下原理,相信如果你写过一次,就能简单的回答出一些问题


注解的作用


像平时用到的 SpringBoot、Mybatis 等框架提供了许多的注解,免去了许多配置文件的繁琐工作,大大简便了开发,Java 提供了自定义注解的功能,这里就先展示简单的例子。


注解可以看作是一种特殊的标记,可以用在方法、类、参数和包上,程序在编译或者运行时可以检测到这些标记而进行一些特殊的处理,例如标注在方法上可以实现接口权限的校验。


使用场景:自定义注解+拦截器或者 AOP。


声明方式:通过关键字 @interface 声明为注解,例子如下:

public @interface MyAnnotation{
}

注解的元素类型


主要有@Target,@Retention,@Document,@Inherited 用来修饰注解。


@Target常用属性

表明该注解可以应用的java元素类型。

20.png

@Retention

表明该注解的生命周期。

21.png

@Documented

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


@Inherited

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


代码实现自定义注解


光说没用,接下来我们实际操作一遍,就能简单感受到自定义注解的作用


1 编写自定义注解


package com.example.annotation;
import java.lang.annotation.*;
/**
 * @description: 自定义注解
 * @author: 魏一鹤
 * @createDate: 2022-08-30 23:04
 **/
//该注解可以应用于类、接口(包括注解类型)、枚举
@Target(ElementType.TYPE)
//该注解标记的元素可以被Javadoc 或类似的工具文档化
@Documented
//该注解的生命周期,由JVM 加载,包含在类文件中,在运行时可以被获取到
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
    // 给自定义注解创建基本属性
    // 可以使用default作为默认值使用
    String name() default "法外狂徒张三";
    // 这里没用default默认赋值,一会手动复制
    int age() ;
}

2 编写实体


package com.example.entity;
import com.example.annotation.MyAnnotation;
import lombok.Data;
/**
 * @description: 用户实体类
 * @author: 魏一鹤
 * @createDate: 2022-08-30 23:06
 **/
@Data
// 把我们自定义的注解作用到user类上
@MyAnnotation(age = 18)
public class User {
    String name;
    int age;
}

3 编写测试代码


package com.example.test;
import com.example.annotation.MyAnnotation;
import com.example.entity.User;
/**
 * @description: 测试自定义注解
 * @author: 魏一鹤
 * @createDate: 2022-08-30 23:09
 **/
public class AnnotationTest {
    public static void main(String[] args){
        //获取User的Class对象
        Class<?> userClass = User.class;
        //判断Class对象上是否有我们设置的自定义注解
        if (userClass.isAnnotationPresent(MyAnnotation.class)) {
            System.out.println("User上配置了自定义注解");
            //获取SystemConfig注解
            MyAnnotation myAnnotation = userClass.getAnnotation(MyAnnotation.class);
            System.out.println("MyAnnotation.name:" + myAnnotation.name() + "; MyAnnotation.age:" + myAnnotation.age());
        } else {
            System.out.println("User上没有配置自定义注解");
        }
    }
}

4 测试效果


首先我们给User实体加上我们的自定义注解,可以看到,成功的通过注解获取到了属性

23.png

然后我们给User实体去掉自定义注解 再次运行 很明显,是获取不到注解的属性的

24.png

结语


至此 一个简单的自定义注解Demo就完成了

如果我们的注解写的比较好的话,对于性能有较大的影响,可用于软件的架构设计,实现动态加载,对于分解复杂业务有帮助。

相关文章
|
8天前
|
Java
Java @Data 注解详细说明
Data注解是 Lombok 提供的一个组合注解,它会为类自动生成一些常见方法的样板代码,包括 getter、setter、equals、hashCode 和 toString 方法。
125 5
|
8天前
|
Java 编译器 程序员
java注解浅述
java注解浅述
13 1
|
8天前
|
算法 安全 Java
性能工具之 JMeter 自定义 Java Sampler 支持国密 SM2 算法
【4月更文挑战第28天】性能工具之 JMeter 自定义 Java Sampler 支持国密 SM2 算法
37 1
性能工具之 JMeter 自定义 Java Sampler 支持国密 SM2 算法
|
1天前
|
Java
【JAVA学习之路 | 提高篇】自定义异常类
【JAVA学习之路 | 提高篇】自定义异常类
|
8天前
|
ARouter Java
Java注解之编译时注解
Java注解之编译时注解
16 3
|
8天前
|
Java 编译器 开发者
Java一分钟之-Java注解的理解与应用
【5月更文挑战第12天】本文介绍了Java注解的基础知识和常见应用,包括定义、应用和解析注解。注解在编译检查、框架集成和代码生成等方面发挥重要作用。文章讨论了两个易错点:混淆保留策略和注解参数类型限制,并提供了避免策略。提醒开发者避免过度使用注解,以保持代码清晰。理解并恰当使用注解能提升代码质量。
15 3
|
8天前
|
Java API Python
java注解
java注解
|
8天前
|
JSON 前端开发 Java
【JAVA进阶篇教学】第七篇:Spring中常用注解
【JAVA进阶篇教学】第七篇:Spring中常用注解
|
8天前
|
IDE Java 数据库连接
Lombok注解大全
这些是Lombok中的一些常见注解,它们可以显著减少Java代码中的冗余代码,提高代码的可读性和可维护性。不过,在使用Lombok之前,请确保你的开发环境已经配置好支持Lombok,通常需要安装相应的插件或进行设置以使IDE(如Eclipse、IntelliJ IDEA)能够正确解析Lombok注解。
35 2
|
8天前
|
Java 编译器 Android开发
Java注解你知多少?
Java注解你知多少?
14 1