Java学习一阶段-27 Java-Api07 注解 定义注解

本文详细介绍了Java注解的原理、分类(JDK自带和自定义),并展示了如何创建和使用自定义注解,包括其在SpringBoot等框架中的重要角色。通过实例学习,理解注解如何简化代码、提升灵活性和自动化生成。

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

1 注解

注解很厉害,它可以增强我们的java代码,同时利用反射技术可以扩充实现很多功能。它们被广泛应用于三大框架底层。
传统我们通过xml文本文件声明方式(如下图,但是XML比较繁琐且不易检查),而现在最主流的开发都是基于注解方式,代码量少,框架可以根据注解去自动生成很多代码,从而减少代码量,程序更易读。例如最火爆的SpringBoot就完全基于注解技术实现。
xml示例
注解设计非常精巧,初学时觉得很另类甚至多余,甚至垃圾。有了java代码干嘛还要有@注解呢?但熟练之后你会赞叹,它竟然可以超越java代码的功能,让java代码瞬间变得强大。大家慢慢体会吧。

2 注解的分类

注解一共分为3大类,我们先来认识一下:

  • JDK自带注解
  • 元注解
  • 自定义注解

2.1 JDK注解

JDK注解的注解,就5个:

@Override :用来标识重写方法

@Deprecated标记就表明这个方法已经过时了,但我就要用,别提示我过期
@SuppressWarnings(“deprecation”) 忽略警告
@SafeVarargs jdk1.7出现,堆污染,不常用
@FunctionallInterface jdk1.8出现,配合函数式编程拉姆达表达式,不常用

2.2 元注解

用来描述注解的注解,就5个:

@Target 注解用在哪里:类上、方法上、属性上等等
@Retention 注解的生命周期:源文件中、字节码文件中、运行中

@Inherited 允许子注解继承
@Documented 生成javadoc时会包含注解,不常用
@Repeatable注解为可重复类型注解,可以在同一个地方多次使用,不常用

2.2.1 @Target ElementType…

描述注解存在的位置:

ElementType.TYPE 应用于类的元素
ElementType.METHOD 应用于方法级
ElementType.FIELD 应用于字段或属性(成员变量)
ElementType.ANNOTATION_TYPE 应用于注释类型
ElementType.CONSTRUCTOR 应用于构造函数
ElementType.LOCAL_VARIABLE 应用于局部变量
ElementType.PACKAGE 应用于包声明
ElementType.PARAMETER 应用于方法的参数

2.2.2 @Retention RetentionPolicy…

该注解定义了自定义注解被保留的时间长短,比如某些注解仅出现在源代码中,而被编译器丢弃;而另一些却被编译在class文件中; 编译在class文件中的注解可能会被虚拟机忽略,而另一些在class被装载时将被读取。
编译运行顺序为何要分字节码文件中有还是没有呢?如果没有时,反射技术就拿不到,从而就无法去识别处理。它的值一共3种:

SOURCE 在源文件中有效(即源文件保留)
CLASS 在class文件中有效(即class保留)
RUNTIME 在运行时有效(即运行时保留)

3 自定义注解

注意:注解的语法写法和常规java的语法写法不同

创建包: cn.tedu. annotation
创建类: TestAnnotation.java

package cn.tedu.annotation;
import jdk.Exported;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/*本类用于测试自定义注解*/
public class TestAnnotation { }
/*1.2 通过@Target注解表示此自定义注解可以使用的位置
* 注意:@Target注解使用时需要导包,我们通过"ElementType.静态常量值"的方式来指定
* 此自定义注解可以使用的位置
* 如果有多个值,可以使用"{ , }"的格式来写:@Target({ElementType.METHOD,ElementType.TYPE})*/
@Target({ElementType.METHOD,ElementType.TYPE,ElementType.FIELD})//表示此注解可以加在方法上
/*1.3通过@Retention注解表示自定义注解的生命周期
* 注意:@Retention使用时也需要导包,通过RetentionPolicy.静态常量值来指定此自定义注解的生命周期
* 也就是指自定义注解可以存在在哪个文件中:源文件中/字节码文件中/运行时有效
* 而且这三个值,只能3选1,不能同时写多个*/
@Retention(RetentionPolicy.SOURCE)
/*0.首先注意:自定义注解的语法与java不同,不要套用java的格式*/
//1.定义自定义主解,注解名是Test,并通过两个元注解表示此注解的作用位置和生命周期
/*1.注解定义要使用"@interface 注解名"的方式来定义*/
@interface Test{
    /*3.自定义注解还可以添加功能--给注解添加属性
    * 注意 int age();不是方法的定义,而是给自定义注解中定义age属性的语法
    * 如果为了使用注解时方便,还可以给属性指定默认值,这样就可以直接使用,格式:int age() default 0;
    * */
    //int age(); //给注解定义一个普通的属性age
    int age() default 0;
    /*4.注解中还可以添加功能-可以定义特殊属性value
    * 特殊属性的定义方式与别的属性相同,主要是使用方式不同
    * 使用此注解给属性赋值的时候,可以不用写成"@Test(value = "Apple")",
    * 格式可以简化"@Test("Apple")"直接写值
    * 但是自定义注解类中的赋予默认值不可以简写,如果自定义了默认值,可以不用赋值,直接使用*/
    String value() default "apple";
}
/*2.使用注解时,只要在指定的自定义注解名字前加上"@"即可使用此注解*/
//2.定义一个类用来测试自定义注解
//@Test
class TeatAnno{
    /*测试1:分别给TestAnno类/name属性/eat()都添加了@Test注解,只有方法上不报错
    * 结论:自定义注解能够加在什么位置,取决于@Target注解的值
    * 测试2:修改@Target注解的值:@Target({ElementType.METHOD,ElementType.TYPE,ElementType.FIELD})
    * 结论:注解@Test可以存在于多个位置,如果@Target有多个值,格式是"{ , }"
    * 原因:Target注解的源码:ElementType[] value();*/
    //@Test
    String name;
    /*测试3:当我们添加了注解的age属性时,@Test注解报错
    * 结论:当注解没有定义属性时,可以直接使用,如果有属性了,就需要给属性赋值
    * 测试4:给@Test注解的age属性赋值以后,就不报错了
    * 结论:给属性赋值的格式" @Test(age = 10)",注意,不能直接写10,这是错误格式
    * 测试5:给age属性赋予默认值后,可以不加属性值,直接使用注解,此时使用的就是age的默认值
    * */
    /*测试6:给特殊属性value赋值时可以简写,想当于value="apple"*/
    @Test/*测试7:因为已有默认值,所以不用给特殊属性赋值,直接使用@Test*/
    //@Test(age = 10)
    public void eat(){
        System.out.println("又到干饭时间啦~");
    }
}

恭喜你,又闯过一关,后续框架部分我们会频繁使用注解,祝你有个好的开端

下一节 反射 点这里

### RT-DETRv3 网络结构分析 RT-DETRv3 是一种基于 Transformer 的实时端到端目标检测算法,其核心在于通过引入分层密集正监督方法以及一系列创新性的训练策略,解决了传统 DETR 模型收敛慢和解码器训练不足的问题。以下是 RT-DETRv3 的主要网络结构特点: #### 1. **基于 CNN 的辅助分支** 为了增强编码器的特征表示能力,RT-DETRv3 引入了一个基于卷积神经网络 (CNN) 的辅助分支[^3]。这一分支提供了密集的监督信号,能够与原始解码器协同工作,从而提升整体性能。 ```python class AuxiliaryBranch(nn.Module): def __init__(self, in_channels, out_channels): super(AuxiliaryBranch, self).__init__() self.conv = nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1) self.bn = nn.BatchNorm2d(out_channels) def forward(self, x): return F.relu(self.bn(self.conv(x))) ``` 此部分的设计灵感来源于传统的 CNN 架构,例如 YOLO 系列中的 CSPNet 和 PAN 结构[^2],这些技术被用来优化特征提取效率并减少计算开销。 --- #### 2. **自注意力扰动学习策略** 为解决解码器训练不足的问题,RT-DETRv3 提出了一种名为 *self-att 扰动* 的新学习策略。这种策略通过对多个查询组中阳性样本的标签分配进行多样化处理,有效增加了阳例的数量,进而提高了模型的学习能力和泛化性能。 具体实现方式是在训练过程中动态调整注意力权重分布,确保更多的高质量查询可以与真实标注 (Ground Truth) 进行匹配。 --- #### 3. **共享权重解编码器分支** 除了上述改进外,RT-DETRv3 还引入了一个共享权重的解编码器分支,专门用于提供密集的正向监督信号。这一设计不仅简化了模型架构,还显著降低了参数量和推理时间,使其更适合实时应用需求。 ```python class SharedDecoderEncoder(nn.Module): def __init__(self, d_model, nhead, num_layers): super(SharedDecoderEncoder, self).__init__() decoder_layer = nn.TransformerDecoderLayer(d_model=d_model, nhead=nhead) self.decoder = nn.TransformerDecoder(decoder_layer, num_layers=num_layers) def forward(self, tgt, memory): return self.decoder(tgt=tgt, memory=memory) ``` 通过这种方式,RT-DETRv3 实现了高效的目标检测流程,在保持高精度的同时大幅缩短了推理延迟。 --- #### 4. **与其他模型的关系** 值得一提的是,RT-DETRv3 并未完全抛弃经典的 CNN 技术,而是将其与 Transformer 结合起来形成混合架构[^4]。例如,它采用了 YOLO 系列中的 RepNCSP 模块替代冗余的多尺度自注意力层,从而减少了不必要的计算负担。 此外,RT-DETRv3 还借鉴了 DETR 的一对一匹配策略,并在此基础上进行了优化,进一步提升了小目标检测的能力。 --- ### 总结 综上所述,RT-DETRv3 的网络结构主要包括以下几个关键组件:基于 CNN 的辅助分支、自注意力扰动学习策略、共享权重解编码器分支以及混合编码器设计。这些技术创新共同推动了实时目标检测领域的发展,使其在复杂场景下的表现更加出色。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值