Java 注解解析获取及自定义

本文详细介绍了Java注解的工作原理,包括如何通过注解的反射机制获取和解析信息,以及如何自定义注解,如`Fruit`注解的实例和使用。通过源码分析,展示了注解在Java中的应用和实现细节。

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

上一篇文章 Java 注解简介 提到,注解本质是一个继承了Annotation 的特殊接口,起到说明、配置的作用。
今天我们就进一步了解它的原理以及如何自定义。

注解原理概述:(理解)

  1. 读取xml配置文件。(这里不做重点解读)
  2. 实例化bean。(这里不做重点解读)
  3. 遍历所有bean对象,再获取bean对象的所有方法或字段或属性,并进行遍历,判定其是否包含指定注解,若包含则进行注解的获取(通过反射获取注解,获取过程中会进行注解信息的解析,返回的是Java 运行时生成的动态代理对象$Proxy1)。
  4. 获取注解的代理对象后,就可以调用自定义注解(接口)的方法,会最终调用AnnotationInvocationHandler 的invoke 方法。该方法会从memberValues 这个Map 中索引出对应的值。而memberValues 的来源是Java 常量池。

测试案例如下:(熟悉)

准备 Fruit 注解类

package com.gump.annotation.custom;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Target({
   FIELD,METHOD})
@Retention(RUNTIME)
@Documented
public @interface Fruit {
   
    /**
     * 名称
     */
    String name() default "";

    /**
     * 产地
     */
    String address() default "";
}

准备 Apple 类

package com.gump.annotation.custom;
import lombok.Setter;
public class Apple {
   

    @Fruit(name="新疆阿克苏糖心苹果",address="新疆阿克苏")
    @Setter
    private String apple;

    @Fruit(name="gump",address = "中国")
    public void sell(){
   
    }
}

准备 FruitRun 测试类

package com.gump.annotation.custom;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值