自定义注解实现--简单理解版

本文深入探讨Java注解的应用及自定义注解的实现过程。介绍了注解的基础概念、元注解的作用及其应用场景,通过实例展示了如何创建并应用自定义注解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、背景知识
XML方案的配置可以说让人眼花缭乱,如网站开发时用到的web.xml,Mybatis的配置xml,Spring的Beans.xml,常常是满满的一大页,配置和排错都很不容易。但是从JDK5.0版本开始引入的Annotation(注解)就可以帮助程序开发人员摆脱这种繁重的配置,同时使元数据和想要配置的类捆绑在一起,一定程度上减轻了错误的发生。(ps:注解就是元数据,即一种描述数据的数据,也可以理解为注解就是源代码的元数据,它定义了一种标准的描述元数据的方式,使用较方便)
本人在学习注解的时候,是先学会注解的使用,发现对于注解还是不太了解,于是开始通过网上的资料学习自定义注解的实现。
首先,在自定义注解之前,我们需要了解注解的常见类型和元注解(非常重要,负责注解其他注解),常见类型有3种,Override(表示将父类的方法重写–阶段是SOURCE)、SuppressWarnings(在程序前面加上可以在javac编译中去除警告–阶段是SOURCE)、Deprecated(带有标记的包,方法,字段说明其过时,但是仍可以使用—-阶段是SOURCE)。
元注解主要有Target(用于描述注解的使用范围)、Retention(用于描述注解的生命周期)、Documented(描述其它类型的annotation应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化。Documented是一个标记注解,没有成员)和Inherited(阐述了某个被标注的类型是被继承的)。详情看下图:
这里写图片描述

主要是Target和Retention两个元注解比较重要,一个表示适用范围,如方法,属性,变量等等,另一个就是决定注解在哪个时期起作用,是编码时期,还是编译时期,还是执行时期。

最后在了解一下自定义注解的相关内容,就可以动手实现了。请看下图
这里写图片描述

二、代码实现
1.自定义的注解Car_color

package tes.annotation;
import static java.lang.annotation.ElementType.CONSTRUCTOR;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.TYPE;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.FIELD)  //表示这个注解的只适用于属性,也可以写多个({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.RUNTIME) //表示注解只在执行期起作用
public @interface Car_color {
    String color() default "白色";  //color方法其实是声明了一个配置参数   
                                   //返回值String就是参数的类型,只能是基本类型
                                   //这里用default默认参数是“白色”
}

2.对象类Car

package tes.annotation;

public class Car {
    @Car_color(color="黑色") //使用自定义注解,这里也可以自己定义color的值
    private String color;

}

3.测试类(Java里专门的注解信息处理流程,主要是利用反射机制,可以自动实现注解,而我们自定义的注解想要使用,就必须自定义一个注解流程才能使用,不然就会失去作用,相当于一个注释)

package tes.annotation;

import java.lang.reflect.Field;

public class Test {
    public static void main(String[] args) throws ClassNotFoundException {
        Class cls=Class.forName("tes.annotation.Car");  //获取类对象
        Field[] field=cls.getDeclaredFields();          //获取类的属性数组
        for(Field f:field){                             //循环属性
            if(f.isAnnotationPresent(Car_color.class)){ //获取属性的注解,并判断是否是Car_color.class注解
                Car_color car=f.getAnnotation(Car_color.class);     //获取Car_color注解对象
                System.out.println("汽车颜色:"+car.color());            //输出注解的color配置参数
            }
        }
    }
}

4.运行结果
这里写图片描述

哈哈,有点懒惰,就只写了一个注解,希望能对你有所帮助!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值