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就完成了

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

相关文章
|
3天前
|
Java 编译器 测试技术
Java基础16-Java注解简介和最佳实践(二)
Java基础16-Java注解简介和最佳实践(二)
15 4
|
16天前
|
存储 安全 Java
Java语言注解(Annotations)的技术性探索
Java语言注解(Annotations)的技术性探索
|
1月前
|
Java 编译器 程序员
java注解浅述
java注解浅述
23 1
|
2天前
|
Java API 数据库
Java一分钟之-JPA注解:@Entity, @Table, @Id等
【6月更文挑战第14天】Java Persistence API (JPA) 是Java开发中的ORM框架,通过注解简化数据访问层。本文介绍了三个核心注解:`@Entity`标识实体类,`@Table`自定义表名,`@Id`定义主键。易错点包括忘记添加`@Entity`、未正确设置主键。建议使用`@GeneratedValue`和`@Column`细化主键策略和字段映射。正确理解和应用这些注解能提高开发效率和代码质量。
15 3
|
2天前
|
Java 数据库连接 Spring
Java注解
Java注解
8 0
|
3天前
|
安全 Java 开发者
Java基础16-Java注解简介和最佳实践(一)
Java基础16-Java注解简介和最佳实践(一)
16 5
|
4天前
|
JavaScript Java 测试技术
《手把手教你》系列技巧篇(七十一)-java+ selenium自动化测试-自定义类解决元素同步问题(详解教程)
【6月更文挑战第12天】本文介绍了如何创建一个自定义类库来解决自动化测试中的元素同步问题。作者指出,大部分错误源于元素因时间不同步而引发,为此提供了一种解决方案。在项目实践中,首先在`library`包下创建名为`MyWait`的类,包含一个方法`isElementPresent`,该方法通过循环尝试并等待指定元素出现,避免了直接使用时间等待可能导致的不准确性。之后,在测试类中调用此自定义方法,成功实现了元素同步。代码示例展示了如何在Java+Selenium自动化测试中应用这个自定义类。
27 2
|
9天前
|
Java
JAVA Swing自定义JScorllPanel
JAVA Swing自定义JScorllPanel
9 1
|
11天前
|
Java API 项目管理
Java一分钟之-Gradle插件开发:自定义构建逻辑
【6月更文挑战第5天】Gradle插件开发详解:从入门到发布。文章介绍如何创建自定义插件,强调依赖管理、任务命名和配置阶段的理解。示例代码展示插件实现及避免常见问题的方法。最后,讨论插件的发布与共享,助你提升构建效率并贡献于开发者社区。动手实践,打造强大Gradle插件!
31 3
|
15天前
|
Java 编译器 测试技术
【Java 基础 - 注解机制详细解释】
不能使用关键字extends来继承某个@interface,但注解在编译后,编译器会自动继承java.lang.annotation.Annotation接口. 虽然反编译后发现注解继承了Annotation接口,请记住,即使Java的接口可以实现多继承,但定义注解时依然无法使用extends关键字继承@interface。 区别于注解的继承,被注解的子类继承父类注解可以用@Inherited: 如果某个类使用了被@Inherited修饰的Annotation,则其子类将自动具有该注解。