前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java学习笔记——新特性-注解

Java学习笔记——新特性-注解

作者头像
梦飞
发布于 2022-06-23 04:30:43
发布于 2022-06-23 04:30:43
23200
代码可运行
举报
文章被收录于专栏:csdn文章同步csdn文章同步
运行总次数:0
代码可运行

Java学习笔记——新特性-注解

文章目录

从 JDK 5.0 开始, Java 增加了对元数据(MetaData) 的支持, 也就是 Annotation(注解)。

Annotation 其实就是代码里的特殊标记,这些标记可以在编译、类加载或运行时被读取,并执行相应的处理。通过使用 Annotation,程序员可以在不改变原有逻辑的情况下,在源文件中嵌入一些补充信息。

Annotation 可以像修饰符一样被使用,可用于修饰包、类、构造器、方法、成员变量、参数、局部变量的声明, 这些信息被保存在 Annotation 的 “name=value” 对中。

Annotation 能被用来为程序元素(类、方法、成员变量等)设置元数据。

1 三个基本的 Annotation

1.1 @Override

限定重写父类(或接口)的方法, 该注解只能用于方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
interface Info{
	void show();
}

class Season{
	@Override
	public void show() {
		System.out.println("这是一个季节");
	}
}

虽然不加Override也可以识别重写的方法。但加了注解之后,有以下两个好处:

  • 便于调试 如果该方法不是父类的方法(比如写错了方法名的某个字母)则编译器会报错,便于调试。
  • 一目了然

1.2 @Deprecated

用于表示某个程序元素(类, 方法等)已过时。

当某类或方法已经有更好的方式替代,但为了兼容性,又不能直接淘汰,就可以使用这个注解,这样新的程序开发时就可以看到这样的改变(用IDE开发时可以看到提示,比如过时的代码会被横线划掉),从而尽量避免使用过时的代码,而使用其替代方案。在一定的时间之后,当所有程序基本上都使用了新的方式时,旧的代码可能被淘汰。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Deprecated(since="9")
public Integer(int value) {
	this.value = value;
}

1.3 @SuppressWarnings

抑制编译器警告。当有需要时,可以这样抑制一些编译器的警告,以满足程序员的“需求”,但使用时应知道自己在干什么。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@SuppressWarnings("unused")
public void printColl(@SuppressWarnings("rawtypes") Collection coll) {
    @SuppressWarnings("rawtypes")
    List list = new ArrayList();
    for(Object object : coll) {
        System.out.println(object);
    }
}

2 自定义 Annotation

  • 使用 @interface 关键字。
  • 成员变量在 Annotation 定义中以无参数方法的形式来声明。
  • 可使用 default 关键字指定成员变量的默认初始值。
  • 可用元注解对其进行注解(见下文)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Inherited
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE, MODULE})
public @interface MyAnnotation {
	String name() default "hello";
}

没有成员定义的 Annotation 称为标记;包含成员变量的 Annotation 称为元数据 Annotation。

3 元 Annotation

JDK 的元 Annotation 用于修饰其他 Annotation 定义。

JDK5.0提供了专门在注解上的注解类型。

几个基本注解的定义中就有元注解:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, MODULE, PARAMETER, TYPE})
public @interface Deprecated {
    /**
     * Returns the version in which the annotated element became deprecated.
     * The version string is in the same format and namespace as the value of
     * the {@code @since} javadoc tag. The default value is the empty
     * string.
     *
     * @return the version string
     * @since 9
     */
    String since() default "";

    /**
     * Indicates whether the annotated element is subject to removal in a
     * future version. The default value is {@code false}.
     *
     * @return whether the element is subject to removal
     * @since 9
     */
    boolean forRemoval() default false;
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE, MODULE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
    /**
     * The set of warnings that are to be suppressed by the compiler in the
     * annotated element.  Duplicate names are permitted.  The second and
     * successive occurrences of a name are ignored.  The presence of
     * unrecognized warning names is <i>not</i> an error: Compilers must
     * ignore any warning names they do not recognize.  They are, however,
     * free to emit a warning if an annotation contains an unrecognized
     * warning name.
     *
     * <p> The string {@code "unchecked"} is used to suppress
     * unchecked warnings. Compiler vendors should document the
     * additional warning names they support in conjunction with this
     * annotation type. They are encouraged to cooperate to ensure
     * that the same names work across multiple compilers.
     * @return the set of warnings to be suppressed
     */
    String[] value();
}

3.1 @Retention

用于指定该 Annotation 可以保留多长时间, @Rentention 包含一个 RetentionPolicy 类型的成员变量, 使用 @Rentention 时必须为该 value 成员变量指定值。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
    /**
     * Returns the retention policy.
     * @return the retention policy
     */
    RetentionPolicy value();
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public enum RetentionPolicy {
    /**
     * Annotations are to be discarded by the compiler.
     */
    SOURCE,

    /**
     * Annotations are to be recorded in the class file by the compiler
     * but need not be retained by the VM at run time.  This is the default
     * behavior.
     */
    CLASS,

    /**
     * Annotations are to be recorded in the class file by the compiler and
     * retained by the VM at run time, so they may be read reflectively.
     *
     * @see java.lang.reflect.AnnotatedElement
     */
    RUNTIME
}
  • RetentionPolicy.SOURCE:编译器直接丢弃这种策略的注释。
  • RetentionPolicy.CLASS:编译器将把注释记录在 class 文件中。当运行 Java 程序时,JVM 不会保留注解。 这是默认值。
  • RetentionPolicy.RUNTIME:编译器将把注释记录在 class 文件中。当运行 Java 程序时,JVM 会保留注解。程序可以通过反射获取该注解。

3.2 @Target

用于指定被修饰的 Annotation 能用于修饰哪些程序元素。包含一个名为 value 的成员变量。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
    /**
     * Returns an array of the kinds of elements an annotation type
     * can be applied to.
     * @return an array of the kinds of elements an annotation type
     * can be applied to
     */
    ElementType[] value();
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public enum ElementType {
    /** Class, interface (including annotation type), or enum declaration */
    TYPE,

    /** Field declaration (includes enum constants) */
    FIELD,

    /** Method declaration */
    METHOD,

    /** Formal parameter declaration */
    PARAMETER,

    /** Constructor declaration */
    CONSTRUCTOR,

    /** Local variable declaration */
    LOCAL_VARIABLE,

    /** Annotation type declaration */
    ANNOTATION_TYPE,

    /** Package declaration */
    PACKAGE,

    /**
     * Type parameter declaration
     *
     * @since 1.8
     */
    TYPE_PARAMETER,

    /**
     * Use of a type
     *
     * @since 1.8
     */
    TYPE_USE,

    /**
     * Module declaration.
     *
     * @since 9
     */
    MODULE
}

3.3 @Documented

用于指定被被修饰的 Annotation 类将被 javadoc 工具提取成文档。

定义为 Documented 的注解必须设置 Retention 值为 RUNTIME。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Documented {
}

3.4 @Inherited

被它修饰的 Annotation 将具有继承性。如果某个类使用了被 @Inherited 修饰的 Annotation,则其子类将自动具有该注解。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Inherited {
}

4 利用反射获取注解信息

JDK 5.0 在 java.lang.reflect 包下新增了 AnnotatedElement 接口,该接口代表程序中可以接受注解的程序元素。

程序可以调用 AnnotatedElement 对象的如下方法来访问 Annotation 信息。

Modifier and Type

Method and Description

<T extends Annotation> T

getAnnotation(Class<T> annotationClass) Returns this element’s annotation for the specified type if such an annotation is present, else null.

Annotation[]

getAnnotations() Returns all annotations present on this element.

Annotation[]

getDeclaredAnnotations() Returns all annotations that are directly present on this element.

boolean

isAnnotationPresent(Class<? extends Annotation> annotationClass) Returns true if an annotation for the specified type is present on this element, else false.

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-06-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
分布式反馈(DFB)激光器
DFB激光器Distributed Feedback (DFB) Lasers,为克服FP激光器Fabry-Perot Laser的缺点而生。
睐芯科技LightSense
2024/07/24
1900
下一代硅光路线图
几位硅光大佬最近合作撰写了一篇文章,贴在了arXiv上。文章整理总结了当前硅光技术的技术难点与发展趋势,并展望了下一代硅光技术,高屋建瓴,非常值得一读, 原文链接https://arxiv.org/abs/2305.15820。站在大佬们的肩膀上,小豆芽这里整理下相关论点以及自己的一些思考,供大家参考。
光学小豆芽
2023/09/02
2.7K0
下一代硅光路线图
OFC 2025 PDP:单波400G的III-V(NTT/华为)、铌酸锂(Hyperlight/住友)及硅光(Aloe)
OFC 2025 PDP又增添了好几个单波400G的验证结果,其中有华为的540 Gbps EML传光纤30km的报道(OFC 2025 PDP:华为的110 GHz带宽、540 Gbps EML+30km传纤实验)。除此之外,Hyperlight用Ciena的3nm 448Gbps Serdes完成了8×400G的3.2T 2km DR8和FR8实验;NTT也演示了8通道的无制冷高带宽的InP MZM的3.2T 500m传输;住友基于前两年做的集成电光均衡器的高带宽铌酸锂(封装后带宽>100GHz)演示了单波400Gbps 传输(不过是C波段的),PDP之外Coherent是发布了新闻稿会在OFC现场演示400 Gbps的差分EML。
光芯
2025/04/08
3310
OFC 2025 PDP:单波400G的III-V(NTT/华为)、铌酸锂(Hyperlight/住友)及硅光(Aloe)
IEDM 2024:台积电的硅光(高性能工艺平台、CPO、光计算) 进展(一)
台积电在IEDM 2024会议上有好多论文,其中硅光的也有好几篇,看了之后还是很震撼的。
光芯
2025/04/08
1890
IEDM 2024:台积电的硅光(高性能工艺平台、CPO、光计算) 进展(一)
DFB激光器
DFB,Distributed Feedback Laser,即分布式反馈激光器。DFB激光器主要以半导体材料为介质,包括锑化镓(GaSb)、砷化镓(GaAs)、磷化铟(InP)、硫化锌(ZnS)等。DFB激光器具有非常好的单色性(即光谱纯度),它的线宽普遍可以做到1MHz以内,以及具有非常高的边模抑制比(SMSR),可高达40-50dB以上。
用户2760455
2022/06/08
1.4K0
DFB激光器
OFC2022: Intel的硅光版图
今年的OFC会议上,Intel有多个报告,报道了其在硅光领域的核心器件进展以及未来的布局,小豆芽这里简单整理下,供大家参考。
光学小豆芽
2022/03/29
4.7K1
OFC2022: Intel的硅光版图
激光器的线宽和带宽
激光器的线宽和带宽名字很相近,但是表示的意思差很大的。首先看线宽,线宽比较好理解,就是激光光谱的半峰全宽。
用户2760455
2022/06/08
4.1K0
激光器的线宽和带宽
DFB分布反馈激光器:设计和制作
法布里-珀罗激光器(FP-LD)是最常见、最普通的半导体激光器,它最大的特点是激光器的谐振腔由半导体材料的两个解理面构成。目前光纤通信上采用的FP-LD的制作技术已经相当成熟,普遍采用双异质结多量子阱有源层、载流子与光分别限制的结构。
用户2760455
2022/06/08
3.2K0
DFB分布反馈激光器:设计和制作
惠普实验室的DWDM硅光平台
惠普实验室(Hewlett Packard Labs, 以下简称HPL)的硅光平台,主要特色是异质集成了InAs/GaAs材料,既实现了片上的量子点频率梳激光器,也实现了MOSCAP型调制器,其主要工艺步骤如下图所示,
光学小豆芽
2022/12/02
1.3K0
惠普实验室的DWDM硅光平台
Intel的硅光子技术
上一篇笔记主要介绍了IBM的硅光封装方案 IBM的硅光封装方案。作为半导体行业的执牛首者,Intel经过十多年(2004年起)的硅光技术积累,已经在2016年发布了其硅光的产品,包括PSM4和CWDM4两种。这篇笔记主要整理下Intel公司的硅光子相关技术方案。
光学小豆芽
2020/08/13
4.4K0
Nokia Bell Labs基于硅基板(SiOB)的低热串扰C+L大范围可调激光器
来看下Nokia Bell Labs另外一个关于SiOB的工作,做了一个可用于相干光通信的大范围C+L可调谐激光器,用的是传统的空间光分立组件的方案,发表在OE期刊上边。(https://doi.org/10.1364/OE.523097)
光芯
2025/04/08
640
Nokia Bell Labs基于硅基板(SiOB)的低热串扰C+L大范围可调激光器
ECOC 2024前瞻: 激光器专题
ECOC2024下周就要开了,先根据放出来的日程提前整理一些文章信息。看了一下还是有些比较有趣的激光器论文,涉及高速EML、高速InP可调光源、大范围/多通道外腔光源、高速大功率PCSEL等。
光芯
2025/04/08
870
ECOC 2024前瞻: 激光器专题
改善红光激光COD
COD全称灾变性光学镜面损伤,是激光器腔面区域吸收谐振腔内部较高的光输出后,导致腔面区域温度超过其材料的熔点,从而发生腔面熔化的一种灾变性破坏。
用户2760455
2022/06/08
6930
改善红光激光COD
激光器光源和硅光器件研读
1、半导体光源作为第二代、第三代半导体材料体系,应用范围很广。根据不同的材料组分、光波段特点,分为很多种。
用户2760455
2022/06/06
1.1K0
激光器光源和硅光器件研读
光通信系统对半导体激光器的要求
光纤通信系统是可以传输模拟信息和数字信息,因此他们对半导体激光器的要求也和其他领域的不同。
用户2760455
2022/06/06
6370
光通信系统对半导体激光器的要求
激光芯片的老化和测试
激光芯片的可靠性是一项十分关键的指标,无论是小功率的激光笔还是要求较高的激光通信芯片,都需要进行芯片的老化和可靠性的测试。
用户2760455
2022/11/16
1.5K0
激光芯片的老化和测试
Intel实现3D混合集成的微环光发射器
这篇笔记主要介绍下Intel在微环光发射器的最新进展,系统中集成了激光器、微环调制器以及基于28nm工艺的driver,实现了112Gb/s的PAM4信号调制,能耗为7.4pJ/bit。
光学小豆芽
2020/10/10
2K0
Intel实现3D混合集成的微环光发射器
硅基III-V族量子点激光器
这一篇笔记调研下硅基III-V族量子点激光器。之前的笔记 硅光芯片的光源中提到在Si上直接外延生长III-V族材料,进而加工结构形成激光器。本篇笔记对此做更详细的介绍。
光学小豆芽
2020/08/13
1.7K0
大功率半导体激光器
1962 年,美国科学家宣布成功研制出了第一代半导体激光器———GaAs 同质结构注入型半导体激光器。由于该结构的激光器受激发射的阈值电流密度非常高,需要 5 × 10^4 ~ 1 × 10^5 A/ cm2,因此它只能在液氮制冷下才能以低频脉冲状态工作。从此开始,半导体激光器的研制与开发利用成为人们关注的焦点。
用户2760455
2022/06/08
1.3K0
大功率半导体激光器
惠普实验室:大规模III-V/Si异质集成光子器件平台助力下一代光计算(一)
(原文链接:https://ieeexplore.ieee.org/document/10835188)
光芯
2025/04/08
1220
惠普实验室:大规模III-V/Si异质集成光子器件平台助力下一代光计算(一)
推荐阅读
相关推荐
分布式反馈(DFB)激光器
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验