Java注解全面解析

Java元注解和注解的解析 在使用注解之前,需要了解:一、什么是注解?二、注解是如何产生作用的?而元注解是一个很好的切入点 元注解的源码结构   从java.lang.annotation包截图看,一共定义了6个注解: @Document @Target @Retention @Inherited @Native @Repeatable 其中前4个是元注解 元注解的定义 元注解负责注解自定义注解... 阅读详情

Java注解全面解析

1.基本语法

注解定义看起来很像接口的定义。事实上,与其他任何接口一样,注解也将会编译成class文件。

@Target(ElementType.Method)

@Retention(RetentionPolicy.RUNTIME)

public @interface Test {}

除了@符号以外,@Test的定义很像一个空的接口。定义注解时,需要一些元注解(meta-annotation),如@Target和@Retention

@Target用来定义注解将应用于什么地方(如一个方法或者一个域)

@Retention用来定义注解在哪一个级别可用,在源代码中(source),类文件中(class)或者运行时(runtime)

在注解中,一般都会包含一些元素以表示某些值。当分析处理注解时,程序可以利用这些值。没有元素的注解称为标记注解(marker annotation)

四种元注解,元注解专职负责注解其他的注解,所以这四种注解的Target值都是ElementType.ANNOTATION_TYPE

注解说明
@Target表示该注解可以用在什么地方,由ElementType枚举定义
CONSTRUCTOR:构造器的声明
FIELD:域声明(包括enum实例)
LOCAL_VARIABLE:局部变量声明
METHOD:方法声明
PACKAGE:包声明
PARAMETER:参数声明
TYPE:类、接口(包括注解类型)或enum声明
ANNOTATION_TYPE:注解声明(应用于另一个注解上)
TYPE_PARAMETER:类型参数声明(1.8新加入)
TYPE_USE:类型使用声明(1.8新加入)
PS:当注解未指定Target值时,此注解可以使用任何元素之上,就是上面的类型
@Retention表示需要在什么级别保存该注解信息,由RetentionPolicy枚举定义
SOURCE:注解将被编译器丢弃(该类型的注解信息只会保留在源码里,源码经过编译后,注解信息会被丢弃,不会保留在编译好的class文件里)
CLASS:注解在class文件中可用,但会被VM丢弃(该类型的注解信息会保留在源码里和class文件里,在执行的时候,不会加载到虚拟机(JVM)中)
RUNTIME:VM将在运行期也保留注解信息,因此可以通过反射机制读取注解的信息(源码、class文件和执行的时候都有注解的信息)
PS:当注解未定义Retention值时,默认值是CLASS
@Documented表示注解会被包含在javaapi文档中
@Inherited允许子类继承父类的注解

2. 注解元素

– 注解元素可用的类型如下:

– 所有基本类型(int,float,boolean,byte,double,char,long,short)

– String

– Class

– enum

– Annotation

– 以上类型的数组

如果使用了其他类型,那编译器就会报错。也不允许使用任何包装类型。注解也可以作为元素的类型,也就是注解可以嵌套。

元素的修饰符,只能用public或default。

– 默认值限制

编译器对元素的默认值有些过分挑剔。首先,元素不能有不确定的值。也就是说,元素必须要么具有默认值,要么在使用注解时提供元素的值。

其次,对于非基本类型的元素,无论是在源代码中声明,还是在注解接口中定义默认值,都不能以null作为值。这就是限制,这就造成处理器很难表现一个元素的存在或缺失状态,因为每个注解的声明中,所有的元素都存在,并且都具有相应的值。为了绕开这个限制,只能定义一些特殊的值,例如空字符串或负数,表示某个元素不存在。

@Target(ElementType.Method)

@Retention(RetentionPolicy.RUNTIME)

public @interface MockNull {

public int id() default -1;

public String description() default “”;

}

3. 快捷方式

何为快捷方式呢?先来看下springMVC中的Controller注解

@Target({ElementType.TYPE})

@Retention(RetentionPolicy.RUNTIME)

@Documented

@Component

public @interface Controller {

String value() default “”;

}

可以看见Target应用于类、接口、注解和枚举上,Retention策略为RUNTIME运行时期,有一个String类型的value元素。平常使用的时候基本都是这样的:

@Controller(“/your/path”)

public class MockController { }

这就是快捷方式,省略了名-值对的这种语法。下面给出详细解释:

注解中定义了名为value的元素,并且在应用该注解的时候,如果该元素是唯一需要赋值的一个元素,那么此时无需使用名-值对的这种语法,而只需在括号内给出value元素所需的值即可。这可以应用于任何合法类型的元素,当然了,这限制了元素名必须为value。

4. JDK1.8注解增强

TYPE_PARAMETER和TYPE_USE

在JDK1.8中ElementType多了两个枚举成员,TYPE_PARAMETER和TYPE_USE,他们都是用来限定哪个类型可以进行注解。举例来说,如果想要对泛型的类型参数进行注解:

public class AnnotationTypeParameter<@TestTypeParam T> {}

那么,在定义@TestTypeParam时,必须在@Target设置ElementType.TYPE_PARAMETER,表示这个注解可以用来标注类型参数。例如:

@Target(ElementType.TYPE_PARAMETER)

@Retention(RetentionPolicy.RUNTIME)

public @interface TestTypeParam {}

ElementType.TYPE_USE用于标注各种类型,因此上面的例子也可以将TYPE_PARAMETER改为TYPE_USE,一个注解被设置为TYPE_USE,只要是类型名称,都可以进行注解。例如有如下注解定义:

@Target(ElementType.TYPE_USE)

@Retention(RetentionPolicy.RUNTIME)

public @interface Test {}

那么以下的使用注解都是可以的:

List<@Test Comparable> list1 = new ArrayList<>();

List<? extends Comparable> list2 = new ArrayList<@Test Comparable>();

@Test String text;

text = (@Test String)new Object();

java.util. @Test Scanner console;

console = new java.util.@Test Scanner(System.in);

PS:以上@Test注解都是在类型的右边,要注意区分1.8之前的枚举成员,例如:

@Test java.lang.String text;

在上面这个例子中,显然是在进行text变量标注,所以还使用当前的@Target会编译错误,应该加上ElementType.LOCAL_VARIABLE。

@Repeatable注解

@Repeatable注解是JDK1.8新加入的,从名字意思就可以大概猜出他的意思(可重复的)。可以在同一个位置重复相同的注解。举例:

@Target(ElementType.TYPE)

@Retention(RetentionPolicy.RUNTIME)

public @interface Filter {

String [] value();

}

如下进行注解使用:

@Filter({“/admin”,”/main”})

public class MainFilter { }

换一种风格:

@Filter(“/admin”)

@Filter(“/main”)

public class MainFilter {}

在JDK1.8还没出现之前,没有办法到达这种“风格”,使用1.8,可以如下定义@Filter:

@Target(ElementType.TYPE)

@Retention(RetentionPolicy.RUNTIME)

@Repeatable(Filters.class)

public @interface Filter {

String  value();

}

@Target(ElementType.TYPE)

@Retention(RetentionPolicy.RUNTIME)

public @interface Filters {

Filter [] value();

}

实际上这是编译器的优化,使用@Repeatable时告诉编译器,使用@Filters来作为收集重复注解的容器,而每个@Filter存储各自指定的字符串值。

JDK1.8在AnnotatedElement接口新增了getDeclaredAnnotationsByType和getAnnotationsByType,在指定@Repeatable的注解时,会寻找重复注解的容器中。相对于,getDeclaredAnnotation和getAnnotation就不会处理@Repeatable注解。举例如下:

@Filter(“/admin”)

@Filter(“/filter”)

public class FilterClass {

public static void main(String[] args) {

Class<FilterClass> filterClassClass = FilterClass.class;

Filter[] annotationsByType = filterClassClass.getAnnotationsByType(Filter.class);

if (annotationsByType != null) {

for (Filter filter : annotationsByType) {

System.out.println(filter.value());

}

}

System.out.println(filterClassClass.getAnnotation(Filter.class));

}

}

日志如下:

/admin

/filter

null

原创文章转载请注明出处:Java注解全面解析

原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: Java注解全面解析

Proteus快速入门(最详细教程) Proteus 是一款用于嵌入式单片机仿真的软件,用于在打PCB板之前对软件程序和硬件电路的正确性进行仿真验证。1.所以Proteus一般会和Keil软件进行联合仿真,在Proteus中绘制系统的电路图,在Keil软件中编写对应的程序后生成Hex文件。2.Proteus的仿真结果仅供参考,只能在一定程度上验证系统的可能性。实际实物系统还需要进行进一步的调试。以上即为本次分享的Proteus入门教程的全部内容,希望可以能够帮助到各位道友。 阅读详情

相关推荐

基于单片机的室内空气质量监控系统设计

摘 要 I Abstract II 引 言 1 1 控制系统设计 3 1.1 方案选择 3 1.2 系统控制原理 4 2系统硬件设计 5 2.1 单片机的选择与设计 5 2.2 温湿度模块设计 6 2.3 甲醛采集模块设计 8 2.4 显示器模块设计 9 2.5 按键模块设计 10 2.6 报警模块设计 11 2.7 加湿及风扇模块设计 11 3系统软件设计 13 3.1 总流程方案设计 13 3.2 温湿度获取的软件设计 14 3.3 液晶屏LCD1602的软件设计 15 4系统调试 13 4

Q_1928499906的博客 2700

java反射

1.运用 Class 类的实例表示正在运行的 Java 应用程序中的类和接口, 他是反射的基础入口 方法:得到字段属性对象Field,getFields(),getDeclaredFields()    得到方法对象Method,getMethods() ,getDeclaredMethods()    得到注解对象Annotation,getAnnotations() ,getD

三爷的专栏 921

MIC(Maximal Information Coefficient)最大互信息系数

MIC(Maximal Information Coefficient)最大互信息系数是一种用于衡量两个变量之间相关性的统计量。它扩展了传统的互信息(MI)和条件互信息(CMI)的概念,具有更广泛的应用范围。MIC能够捕获包括功能性和非功能性的广泛的关联,具有普遍性和公平性。普遍性意味着在足够的样本量下,MIC能够捕捉到广泛的相关关系,而不仅仅局限于特定的功能类型;公平性则意味着MIC对不同类型的包含同等噪声的关系给出了相似的分数。需要注意的是,虽然MIC具有很多优点,但它也有一些局限性。

qlkaicx的博客 4605

Java_Annotation

内容概述Annotation概述基本AnnotationJDK的元Annotation自定义Annotation注解分类一、Annotation概述        Annotation,其实是代码里的特殊标记,这些标记可以在编译、类加载、运行时被读取,并执行相应的处理。通过使用注解,程序开发人员可以在不改变原有逻辑的情况下,在源文件中嵌入一些补充的信息。代码分析工具、开发工具和部署工具可以通过这些...

小特 490

tesseract-ocr的字库学习步骤(训练自己的文库),关于ocr的对图片的解析,包括tesseract的安装(史上最全)

tesseract-ocr的字库学习步骤(训练自己的文库) 简介:在网上看了很多案列。都不是很完整。然后自己用了一天时间进行整理,第一次写文章,希望对大家有帮助。 一、安装tesseract 下载地址https://github.com/UB-Mannheim/tesseract/wiki 1.点击下面下载的这个进行运行(安装的时候有点慢) 2.点击next 3.I accept the terms of the License Agreement前的复选框打勾,点击Next。 4.Install f

HAC12的博客 2229

Python实战:用Sinkhorn算法搞定最优传输问题(附完整代码)

本文详细介绍了如何使用Python实现Sinkhorn算法解决最优传输问题,包括算法原理、关键步骤和完整代码示例。通过实际案例(如图像颜色迁移)展示其高效性和稳定性,适合机器学习开发者和数据科学家应用于分布匹配等场景。

weixin_30879169的博客 98

Java 基础 (10) -- 反射机制

文章目录1. 概念1. 什么是反射2. 反射机制的功能3. 反射获取对象信息的过程4. 反射的好处2. java.lang.reflect 分析1. Mehtod 类1. getAnnotatedReturnType()2. getAnnotatedExceptionTypes()3. getAnnotatedReceiverType()4. getAnnotation(Class annotat...

南京的博客 1786

ESP32蓝牙配网实战:微信小程序中的blufi协议实现与优化

本文详细介绍了在微信小程序中实现ESP32蓝牙配网的实战经验,重点解析了blufi协议的应用与优化。内容涵盖从开发环境配置、协议帧格式解析,到小程序端蓝牙通信、数据转换的核心步骤,并提供了配网状态机设计、错误处理及性能调优等进阶方案,旨在帮助开发者高效、稳定地完成物联网设备配网功能开发。

weixin_29159613的博客 456

Java annotation diff getAnnotation and getDeclaredAnnotation

package xy.core.test; import java.lang.annotation.ElementType; import java.lang.annotation.Inherited; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java....

修也 2717

解决gradle下载慢的问题

allprojects块的repositories用于多项目构建,为所有项目提供共同所需依赖包。而子项目可以配置自己的repositories以获取自己独需的依赖包。buildScript块的repositories主要是为了Gradle脚本自身的执行,获取脚本依赖插件。根级别的repositories主要是为了当前项目提供所需依赖包。慢的问题在于下载时链接的是官网,而官网下载速度太慢;1、解决gradle不同版本下载慢的问题。但是这个镜像站的版本不全,低版本可以用;有公司做的国内镜像站;

weixin_42551921的博客 2052

【突变检验合集】含Pettitt突变检验等

突变检验方法合集

WW、forever的博客 3534

Java注解之解析注解

在《Java注解之基本语法》中我们详细说明了Java中注解的基本语法,也通过一个简单的例子演示了一个简单的注解是怎么定义和使用的。我们知道,在实际的业务开发中,简单的会这点东西是远远不够的。在实际开发中我们定义的注解一般会有实际的逻辑意义,可以在运行时改变程序的执行逻辑,下面就接上上一篇文章讲解在Java中解析注解。这里主要分为两个部分进行讲解:类注解解析、方法注解解析。 1. 类注解解析 类...

I_LV_XJ的博客 970

uniapp:解决微信小程序包体积超过2M的优化方案+详解分包问题,编译小程序体积大于2M不能上传和预览提示体积太大的处理教程,uniApp微信小程序主包过大问题如何解决(排查可疑点+分包+最小改动)

uniapp微信小程序开发,如何解决打包太大无法预览发布的问题,uniApp微信小程序包体积超过2M的优化方法,uni-app打包微信小程序主包超2M终极解决方案,使用uniapp开发微信小程序使用uni_modules导致主包文件过大,无法发布的解决方法,UniApp开发的微信小程序主包过大问题及解决方案 编译小程序时Node-modules被打入主包,小程序体积大于2M不能上传和预览,怎么处理,解决微信小程序主包太大问题,微信小程序中主包和分包过大,详解分包问题,uni-app 微信小程序发布时,主包超

✅ 精选推荐文章 5066

【Java 注解】自定义注解 ( 注解解析 )

一、定义注解、 二、使用注解、 三、解析注解、 四、通过注解对象获取注解属性的原理、

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 2186

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

java注解全面解析

推荐阅读:  我的优快云  我的博客园  QQ群:704621321  我的个人博客 一。全面解析Java注解 1.为什么学习Java注解?学习Java注解有何好处?学完能做什么? (1)能·读懂别人写的代码,特别是框架相关的代码 (2)让编程更加简洁,代码更加清晰 (3)让别人高看一眼 2.Java注解概念 Java提供了一种源程序中的元素任...

爱上游戏开发 2659

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Java注解的解析

又比如,要解析成员方法上的注解,则应该获取到该成员方法的Method对象,再通过Method对象解析其上面的注解。比如要解析类上面的注解,则应该先获取该类的Class对象,再通过Class对象解析其上面的注解。定义一个类叫Demo:在类中定义一个go方法,并在该类和其他方法上使用MyTest注解。就是判断类上、方法上、成员变量上是否存在注解,并把注解里的内容解析出来。定义一个AnnotationTest测试类,解析Demo类中的全部注解。主要思想:要解析谁上面的注解,就应该先拿到谁。

m0_73592039的博客 938

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

java注解解析

阅读目录 一、概念 二、Java中的常见注解 三、注解的分类 四、自定义注解 五、注解的项目实战 六、注解总结 为什么学习注解? 学习注解有什么好处? 学完能做什么? 答:1. 能够读懂别人写的代码,特别是框架相关的代码;   2. 让编程更加简洁,代码更加清晰;   3. 让别人高看一眼。 spring、mybatis使用了大量的注解,会用注解不是目的,会使用自定义注解才...

417

Java-注解解析

Java-注解 文章目录Java-注解一、定义1.1 作用二、预定义注解三、自定义注解3.1 格式3.2 本质3.3 注解内的属性3.4 元注解四、注解解析 一、定义 注解(Annotation),也叫元数据。一种代码级别的说明。JDK1.5之后引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。 1.1 作用 ①编写文档:通过代码里标识的注解生成文档【生成文档doc文档】 ②代码分析:通过代码里标识的注解对代码进行分析

你的博客 4027

java--最全注解解析

java--最全注解解析注解标准注解元注解Target 范围Retention 声明周期Documented 说明文档Inherited 传播注解元素注解元素的值注解元素的默认名称注解不支持继承注解解析器实例--定义注解注解类构造方法属性方法参数变量实例--解析注解注解类构造方法属性方法参数变量 github地址: https://github.com/a18792721831/studyjdk.git model: 先来一张图总览: 注解 Annotation(注解)是 Java 提供的一种对元程序中

a18792721831的博客 540

注解报错_java注解全面解析

>推荐阅读: - 我的优快云 - 我的博客园 - QQ群:704621321 - 我的个人博客一。全面解析Java注解1.为什么学习Java注解?学习Java注解有何好处?学完能做什么?(1)能·读懂别人写的代码,特别是框架相关的代码(2)让编程更加简洁,代码更加清晰(3)让别人高看一眼2.Java注解概念Java提供了一种源程序中的元素任何信息和任何元数据的途径和方法3.Java...

weixin_34846784的博客 121

全面解析java注解

相信有过编程经验的人都见过注解这种东西,也许像我一样,会用、熟练之后,也就一直放那不管了。但是有没有一天突然想到,注解是个什么东西,如果你想到了,那么恭喜你,恭喜你想到了。不论多么复杂的框架、多么复杂的代码、无非是封装、继承、反射、泛型。但是,注解这种东西,是完全独立于java正常体系之外的东西,所以今天在这里一探究竟。 1.java常用注解:@Override(覆盖,覆写),@Deprecat...

weixin_34018202的博客 84

java中注解的解析_【Java】中的注解与注解解析器

/*** 该注解描述了作用范围* java RetentionPolicy.SOURCE* java+class RetentionPolicy.CLASS* java+class+jvm RetentionPolicy.RUNTIME*/@Retention(RetentionPolicy.RUNTIME)/*** 该注解既能在类上也能在方法上...

weixin_39546312的博客 209

Java注解(Annotation)详解(三)——解析注解

(三)解析注解

添仔哥哥 8908

Java中注解的解析,得到注解的属性值,并调用注解标记的方法

代码: import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class MyAnTest { @MyTest(name = "张飞") public void test01(){ System.out.println("自定义注解...

xilin6664的博客 3621

Java 注解入门 元注解 注解解析 kaki的博客

Java 注解 注解解析 kaki的博客 1. 注解的概述 注解是JDK1.5的新特性。 注解相当⼀一种标记,是类的组成部分,可以给类携带⼀一些额外的信息。 标记(注解)可以加在包,类,字段,⽅方法,⽅方法参数以及局部变量量上。 注解是给编译器器或JVM看的,编译器器或JVM可以根据注解来完成对应的功能。 注解 (Annotation) 相当于⼀一种标记,在程序中加⼊...

qq_44988088的博客 490
上一篇: 并发编程 - Boost Thread
下一篇: 服务器性能指标(一)——负载(Load)分析及问题排查
TuxedoLinux
博客等级 码龄9年 268粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值