Annotation: 使用

通常,应用程序并不是必须定义annotation类型,但是定义annotation类型并非难事。

Annotation类型声明与一般的接口声明极为类似,区别只在于它在interface关键字前面使用”@“符号。

 

Annotation类型的每个方法声明定义一个annotation类型成员,但方法声明不必有参数或异常声明;

方法返回值类型被限制在以下范围:private、String、Class、enums、annotation和前面类型的数组;方法可以有默认值。

 

一个简单的annotation类型声明:

public @interface RequestForEnhancement {
        int    id();
        String synopsis();
        String engineer() default "[unassigned]"; 
        String date();    default "[unimplemented]"; 
}

 代码中只定义一个annotation类型RequestForEnhancement

 

修饰方法的annotation声明方式:

annotation是一种修饰符,能够和其它修饰符(如public、static、final)一般使用。

习惯用法是annotation用在其它修饰符前面。

annotation有"@+annotation类型+带有括号的成员-值列表"组成。

这些成员的值必须是编译时常量(即在运行时不变)。

@RequestForEnhancement(
        id       = 2868724,
        synopsis = "Enable time-travel",
        engineer = "Mr. Peabody",
        date     = "4/1/3007"
)
public static void travelThroughTime(Date destination) { ... }

 一个使用了RequestForEnhancement annotation的方法声明

 

/////////////////////////////////////////////////// ///////////////////////////////////////////////////

 

声明一个没有成员的annotation类型,可使用以下方式:

public @interface Preliminary { }

作为上面没有成员的annotation类型声明的简写方式:

@Preliminary public class TimeTravel { ... }

 

/////////////////////////////////////////////////// ///////////////////////////////////////////////////

 

如果在annotation中只有唯一一个成员,则该成员应命名为valua:

public @interface Copyright {
        String value();
}

更为方便的是对于具有唯一成员且成员名为value的annotation(如上文),在其使用时可以忽略掉成员名和赋值号(=)

@Copyright("2002 Wei.peng Test System")
public class OscillationOverthruster { ... }
 

/////////////////////////////////////////////////// ///////////////////////////////////////////////////

 

一个使用实例

基于annotation测试框架:

首先需要annotation类型来表示某个方法是一个应该被测试工具运行的测试方法

    import java.lang.annotation.*;

    /**
     * Indicates that the annotated method is a test method.
     * This annotation should be used only on parameterless static methods.
     */
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.METHOD)
    public @interface Test { }

值得注意的是annotation类型声明是可以标注自己的,这样的annotation被称为”meta-annotation“。

在上面的代码中,@Retention(RetentionPolicy.RUNTIME)这个meta-annotation表示了此类型的 annotation将被虚拟机保留使其能够在运行时通过反射被读取。而@Target(ElementType.METHOD)表示此类型的 annotation只能用于修饰方法声明。

 

一个简单的程序,其中部分方法被上面的annotation所标注

public class Foo {
        @Test public static void m1() { }

        public static void m2() { }

        @Test public static void m3() {
            throw new RuntimeException("Boom");
        }

        public static void m4() { }

        @Test public static void m5() { }

        public static void m6() { }

        @Test public static void m7() {
            throw new RuntimeException("Crash");
        }

        public static void m8() { }
}

 Here is the testing tool:

import java.lang.reflect.*;

public class RunTests {
       public static void main(String[] args) throws Exception {
          int passed = 0, failed = 0;
          for (Method m : Class.forName(args[0]).getMethods()) {
             if (m.isAnnotationPresent(Test.class)) {
                try {
                   m.invoke(null);
                   passed++;
                } catch (Throwable ex) {
                   System.out.printf("Test %s failed: %s %n", m, ex.getCause());
                   failed++;
                }
             }
          }
          System.out.printf("Passed: %d, Failed %d%n", passed, failed);
       }
}

这 个程序从命令行参数中取出类名,并且遍历此类的所有方法,尝试调用其中被上面的测试annotation类型标注过的方法。在此过程中为了找出哪些方法被 annotation类型标注过,需要使用反射的方式执行此查询。如果在调用方法时抛出异常,此方法被认为已经失败,并打印一个失败报告。最后,打印运行 通过/失败的方法数量。
下面文字表示了如何运行这个基于annotation的测试工具: 

$ java RunTests Foo
Test public static void Foo.m3() failed: java.lang.RuntimeException: Boom 
Test public static void Foo.m7() failed: java.lang.RuntimeException: Crash 
Passed: 2, Failed 2
 

 

/////////////////////////////////////////////////// ///////////////////////////////////////////////////

 

 

 

Annotation分类

 

1、内建Annotation---Java5.0版在java语法中经常用到的内建Annotation

@Deprecated 用于修饰已经过时的方法

@Override 用于修饰此方法覆盖了父类的方法(而非重载)

@SuppressWarning 用于通知java编译器禁止特定的编辑警告

import java.util.List;

public class UsingBuiltInAnnotation {
        //食物类
        class Food{}
        //干草类
        class Hay extends Food{}
        //动物类
        class Animal{
                Food getFood(){
                        return null;
                }
                //使用Annotation声明Deprecated方法
                @Deprecated
                void deprecatedMethod(){
                }
        }
        //马类-继承动物类
        class Horse extends Animal{
                //使用Annotation声明覆盖方法
                @Override
                Hay getFood(){
                        return new Hay();
                }
                //使用Annotation声明禁止警告
                @SuppressWarnings({"deprecation","unchecked"})
                void callDeprecatedMethod(List horseGroup){
                        Animal an=new Animal();
                        an.deprecatedMethod();
                        horseGroup.add(an);
                }
        }
}

 

2、开发者自定义Annotation,由开发者自定义Annotation类型


3、使用第三方开发的Annotation类型

开发人员所常常用到的一种方式,比如我们使用Hibernate3.0时就可以利用Annotaion生成数据表映射配置文件。

C++网络编程 - Boost::asio异步网络编程 - 01- boost库源码编译安装 知识的学习在于点滴记录,坚持不懈;知识的学习要有深度和广度,不能只流于表面,坐井观天;知识要善于总结,不仅能够理解,更知道如何表达! 目录 如果需要录屏资料,请私信邮箱shitou3000@qq.com获取。 ... 阅读详情

相关推荐

用矿卡P104-100在PVE 8.0.4上跑Ollama:保姆级显卡直通与驱动安装避坑指南

本文详细介绍了如何在PVE 8.0.4环境下通过显卡直通技术,利用矿卡P104-100高效部署本地大模型Ollama的全流程。从硬件配置、BIOS设置到驱动安装和性能调优,提供了保姆级的避坑指南和实战解决方案,特别针对矿卡无显示输出的特殊性进行了优化。

weixin_33228769的博客 754

Java Annotation手册

Java Annotation手册 作者:cleverpig(作者的Blog:[url]http://blog.matrix.org.cn/page/cleverpig[/url])原文:[url]http://www.matrix.org.cn/resource/article/44/44055_Java+Annotation+Reflect.html[/url]关键字...

weixin_34210740的博客 179

从ORCAP-1589警告看Cadence ORCAD的DRC设置:如何避免‘网络别名’引发的潜在短路风险

本文深入解析Cadence ORCAD中ORCAP-1589警告的深层含义,探讨网络别名可能引发的短路风险及DRC设置优化方案。通过分析网络别名的设计意图、DRC规则配置及最佳实践,帮助工程师有效规避设计风险,提升电路设计的可靠性和规范性。

weixin_34194829的博客 297

annotation注解学习(by quqi99)

annotation注解学习(by quqi99) 作者:张华 发表于:2009-06-19  ( http://blog.youkuaiyun.com/quqi99 )版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明。  1) 定义注解:    package test.annotation;impor

技术并艺术着 1649

Ubuntu20.04 安装 MATLAB R2023b 常见问题及解决方案

本文提供了Ubuntu20.04系统上安装MATLAB R2023b的完整指南,包括系统要求检查、依赖项安装、详细安装步骤及常见问题解决方案。特别针对GTK模块加载失败、OpenGL图形加速问题和中文显示乱码等常见问题提供了有效解决方法,帮助用户顺利完成安装并优化使用体验。

weixin_42619061的博客 486

【ANSYS APDL】提取结构刚度矩阵完整过程--附Python代码实现

ANSYS的结构刚度矩阵提取中一些操作技巧

m0_61038364的博客 1万+

SpringCloud/SpringBoot升级拆坑

在spring官方网站的主页里,赫赫醒目的标题写着“”;(Spring使Java简单易用、紧跟时代、复用性强、快速响应、云就绪)如spring所宣称的;springcloud/springboot就是使用java语言里实现和搭建微服务体系;最好的Java微服务技术框架、微服务项目开发框架以及微服务化的解决方案;目前springcloud是依托springboot来实现整个微服务体系;每个springcloud的组件也都是依赖于springboot;springboot和springcloud版本如下。...

4443

18、AI在基础设施管理与运维中的应用及未来趋势

本文探讨了人工智能(AI)在基础设施管理和运维中的广泛应用,包括性能优化、成本节约、网络安全等多个场景。文章详细介绍了AI在不同领域的应用工具、实际案例以及面临的挑战,并展望了未来AI在基础设施管理中的发展趋势。此外,还分析了AI与Site Reliability Engineering(SRE)框架的结合优势,展示了AI如何提升运维效率和系统可靠性。

n7o8p的博客 148

Annotation注解

Annotation称为注释或注解,它是一个接口。注解提供了一种为程序元素(类、方法、成员变量等)设置元数据(描述其它数据的数据)的方法。编译器、开发工具或其它程序中可以通过反射来获取程序中的Annotation对象,通过该对象获得注解里的元数据。注解不影响程序代码,通过使用注解可以在不改变程序逻辑的情况下,在源文件中嵌入一些补充信息。 1、基本注释 @Override:表明该方...

milanleon的专栏 4365

18、地下矿山中人工智能在区分真实微震事件与噪声信号的应用

本文提出一种基于遗传编程(GP)的新型经验模型,用于地下矿山中真实微震事件与噪声信号(特别是爆破信号)的自动区分。针对传统方法和常见机器学习算法存在的黑箱问题、过拟合及准确性不足等局限,GP模型通过符号回归和进化机制生成可解释的数学表达式,具备自动特征选择能力,有效提升了分类准确率。研究使用包含100个样本的真实数据库,结合敏感性分析优化模型参数,并与线性判别分析(LDA)进行对比,结果表明GP模型在分类性能上更具优势。该模型可应用于实时微震监测系统,提高矿山安全生产水平,降低误判带来的成本开销,具有良好的

assembly8low的博客 95

中国农业银行——轻量式云原生应用平台(轻云平台)

2021年10月,中国人民银行等联合发布了《关于规范金融业开源技术应用与发展的意见》(银办发〔2021〕146 号),规范金融机构合理应用开源技术,提高应用水平和自主可控能力,促进开源技术健康可持续发展。前期,为助力成员单位做好开源技术应用与发展工作,北京金融科技产业联盟开源专委会组织了金融业开源技术应用、创新等方面的案例征集,现对部分优秀案例进行宣传,发挥先进典型示范引领作用。申报单位:中国农业银行股份有限公司技术领域:云原生、无服务器架构(Serverless)、DevOps。

银行信息系统应用架构详解 2393

在spring使用annotation时错误

在运行启动时有下面的错误 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.context.annotation.internalRequiredAnnotationProcessor': Initialization of bea

我的blog 1561

面向业务角色的 SAP Fiori Space 与 Page 创建全流程实战指南

业务角色导航设计:从Space与Page规划到实施 摘要:本文探讨了SAP S/4HANA Cloud和BTP ABAP环境中基于业务角色的导航设计方法。传统Fiori Launchpad的Group+Tile模式存在应用堆积问题,而新的Space与Page模型将导航按工作领域(如应付会计、销售代表)组织,每个Space包含多个任务导向的Page。文章详细介绍了从业务角色建模到Space/Page创建、分配的完整流程,包括核心概念解析、规划思路和具体操作步骤。重点阐述了如何根据业务需求选择创建方式(基于预交

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 185

Annotation

java中Annotation的详细用法

TumblerAh的博客 888

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

注解Annotation

一、Annotation的简单介绍 1、什么是Annotation?        Annotation其实就是代码里的一种特殊标记,这些标记可以在编译、类加载、运行时被读取,并执行相应的处理。 2、Annotation的好处:       通过使用Annotation,程序开发人员可以在不改变原有逻辑的情况下,在源文件中嵌入一些补充信息。       JDK1.5新特性中的Annota

it_Shine的博客 1275

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

java annotation 必须_Java 注释 Annotation

从JDK 5开始,Java增加了对元数据(MetaData)的支持,也就是Annotation(注释)。Annotation提供了一种为程序元素设置元数据的方法,从某些方面来看,Annotation就想修饰符一样,可用于修饰包、类、构造器、方法、成员变量、参数、局部变量的声明,这些信息被存储在Annotation的”name = value”对中Annotation是一个接口,程序可以通过反射来获...

weixin_42561910的博客 274

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

java annotation 必须_Java Annotation 必须掌握的特性

什么是Annotation?Annotation翻译为中文即为注解,意思就是提供除了程序本身逻辑外的额外的数据信息。Annotation对于标注的代码没有直接的影响,它不可以直接与标注的代码产生交互,但其他组件可以使用这些信息。Annotation信息可以被编译进class文件,也可以保留在Java 虚拟机中,从而在运行时可以获取。甚至对于Annotation本身也可以加Annotation。那些...

weixin_31129503的博客 86

java annotation list_Java中Annotation用法

AnnotationAnnotation其实是代码里的特殊标记,这些标记可以在编译、类加载、运行时被读取,并执行相应的处理。通过使用Annotation,程序开发人员可以在不改变原有逻辑的情况下,在源文件嵌入一些补充信息。代码分析工具、开发工具和部署工具可以通过这些补充信息进行验证或者进行部署。Annotation提供了一条为程序元素设置元数据的方法,从某些方面来看,Annotation就像修饰符...

weixin_35292208的博客 397

java annotation 必须_Java Annotation-必须掌握的特性

什么是Annotation?Annotation翻译为中文即为注解,意思就是提供除了程序本身逻辑外的额外的数据信息。Annotation对于标注的代码没有直接的影响,它不可以直接与标注的代码产生交互,但其他组件可以使用这些信息。Annotation信息可以被编译进class文件,也可以保留在Java 虚拟机中,从而在运行时可以获取。甚至对于Annotation本身也可以加Annotation。那些...

weixin_39956110的博客 95

java annotation详解_Java注解Annotation详解

从JDK5开始,Java增加了Annotation(注解),Annotation是代码里的特殊标记,这些标记可以在编译、类加载、运行时被读取,并执行相应的处理。通过使用Annotation,开发人员可以在不改变原有逻辑的情况下,在源文件中嵌入一些补充的信息。代码分析工具、开发工具和部署工具可以通过这些补充信息进行验证、处理或者进行部署。Annotation提供了一种为程序元素(包、类、构造器、方法...

weixin_42525343的博客 5857

Java凝视Annotation

Java凝视Annotation Java凝视Annotation 从JDK 5開始,Java添加了对元数据(MetaData)的支持,也就是Annotation(凝视)。Annotation提供了一种为程序元素设置元数据的方法。程序元素包含修饰包、类、构造...

185

Java:自定义Annotation

一、自定义Annotation步骤  使用@interface关键字定义新的Annotation  //定义一个简单的Annotation类型 public @interface Test{ }  用于修饰程序的类、方法、变量、接口等定义  //使用@Test修饰类定义 @Test public class MyClass{ }

1024工场 2534

自定义Annotation以及通过反射技术获取程序元素上的Annotation注解信息

Anonotation的含义:中文翻译为"注解",实际上表示的是一种注释的语法,这种注释和代码的注释是不一样的,代码的注释如单行注释使用双斜杠"//",或多行注释使用"/*...*/"等是给程序员看的,其主要是为了增加代码的可读性,便于代码的后期维护。而Annotation主要是服务于编译器,属于一种配置信息。在本质上,Annotation提供了一种与程序元素关联任何信息或任何元数据的方式。Ann...

qq_43648299的博客 452

java annotation 属性_java annotation 获取属性

自定义Annotation1.声明一个annotation,类型是@interface//声明注解@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interfaceValueBind {enumfieIdType {STRING, INT};fieIdType type()default...

weixin_28339527的博客 803
上一篇: JVM 内存最大能调多大
下一篇: Annotation: 高级应用
pengwei1221
博客等级 码龄16年 1粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值