Java注解Annotation小结

简介: Java注解Annotation小结

对于java注解我之前就是仅仅拿来使用,也没有深究其背后的细节。但新工作使用新框架,原本一些清晰透明的配置信息,被公司公共平台开发的组件进行了抽离,并通过注解的方式进行了简化。虽然结果上是简化了开发,但却进一步强化了我内心对技术成长的焦虑。


因为简化了开发,让我觉得不可捉摸,所以我觉得自己有必要带着疑问首先要把注解搞清楚,然后后面再抽时间把组件背后也即是APT的部分搞明白。这样关于新公司简化开发省去的部分自己才能真正做到心知肚明。我相信如此一步步来,才能帮助自己实现技术的成长与提升。



1 Java注解核心要义概述


Java注解是从jdk5开始出现的,它是代码里面的特殊标记,这些标记可以在编译、类加载、运行时被读取,并执行相应的处理。通过使用注解,开发人员可以在不改变原有逻辑的情况下,在源文件中嵌入一些补充的信息,比如代码分析工具、开发工具和部署工具等。


Java注解作为一种修饰符,它可以用来修饰包、类、构造器、方法、成员变量、参数、局部变量的声明,在修饰的同时也可以设置元数据(name=value)。


Java注解(Annotation)是一个接口,程序可以通过反射来获取指定程序元素的Annotation对象,然后通过Annotation对象来取得注解里的元数据。


值得指出的是,Annotation不影响程序代码的执行,无论增加、删除Annotation,代码都会始终如一地执行。如果希望让程序中的Annotation在运行时起一定的作用,只有通过某种配套的工具对Annotation中的信息进行访问和处理,访问和处理Annotation的工具统称APT(Annotation Processing Tool)。


2 注解分类


根据Annotation是否包含成员变量,可以把Annotation分为两类:


  • 标记Annotation:没有定义成员变量,是仅利用自身的存在与否提供信息,比如注解@Test、@Override。


  • 元数据Annotation:包含成员变量。


下面介绍常见的注解:


2.1 java.lang下5个基本标记Annotation


  • @Override:限定重写父类方法,作用就是告诉编译器检查被修饰的这个方法,保证父类要包含一个被该方法重写的方法,否则就会编译出错。主要就是帮助程序员避免一些低级错误。


  • @Deprecated:标示已过时


  • @SuppressWarnings:抑制编译器警告。


  • @SafeVarargs:java7的堆污染警告。当把一个不带泛型的对象赋给一个带泛型的变量时,往往会发生这种堆污染;对于形参个数可变的方法,如果形参类型又是泛型的话,就更容易导致堆污染。


  • @FunctionalInterface:java8的函数式接口,用来指定某个接口必须是函数式接口。也就是告诉编译器检查这个接口,保证该接口只能包含一个抽象方法,否则就会编译出错。


2.2 jdk的元Annotation


  • @Retention:只能用于修饰Annotation定义,用于指定被修饰的Annotation可以保留多长时间


@Retention包含一个RetentionPolicy类型的value成员变量,value成员变量的值只能是如下三个:


(1) RetentionPolicy.CLASS(注解记录在class文件中,程序运行时,jvm不可获取注解信息);


(2)RetentionPolicy.RUNTIME(注解记录在class文件中,程序运行时,jvm可获取注解信息) ;


(3)RetentionPolicy.SOURCE(只保留在源代码中,编译器直接丢弃这种注解)。


  • @Target:只能用于修饰Annotation定义,用于指定被修饰的Annotation可以用于修饰那些程序单元


该成员变量的值只能是如下几个:


(1)ElementType.ANNOTATION_TYPE(只能修饰注解);


(2)ElementType.CONSTRUCTOR(只能修饰构造器);


(3)ElementType.FIELD(只能修饰成员变量);


(4)ElementType.LOCAL_VARIABLE(只能修饰局部变量);


(5)ElementType.METHOD(只能修饰方法);


(6)ElementType.PACKAGE(只能修饰包定义);


(7)ElementType.PARAMETER(只能修饰参数);


(8)ElementType.TYPE(只能修饰类、接口或枚举定义)。


  • @Documented:用于指定被该元Annotation修饰的Annotation类将被javadoc工具提取成文档。


  • @Inherited:用于指定被它修饰的注解具有继承性,父类被该注解修饰,子类也自动被该注解修饰。


3 自定义注解


  • (1)定义新的注解类型使用@interface关键字;


  • (2)新定义的注解可以带成员变量,成员变量以无形参的方法形式来声明,其方法名和返回值定义了该成员变量的名字和类型。


-(3) 可以为注解的成员变量指定初始值即默认值,指定成员变量的初始值可以使用default关键字

public @interface Mytag{
  String name() default "xiaoming";
  int age();
}


4 提取注解信息


使用Annotation修饰了类、方法、成员变量等成员之后,这些注解不会自己生效,必须由开发者提供相应的工具来提取并处理注解信息。从java5开始,java.lang.reflect包所提供的反射API增加了读取运行时注解的能力。


至于APT工具的开发实例,后面深挖学习之后,再做进一步分享。


提取注解信息-后话


作为一个开发人员,我之前很少使用自定义注解,所以对于读取注解之前是很不熟悉。而经过一段时间的学习之后,我对于读取使用注解有了新的思考。尤其是对于使用Spring开发框架的我们,有着很好的优势,因为Spring给我们提供了很多方式可以来读取运行时中注解。


比如,web接口中对于加在方法上的注解,我们可以通过使用拦截器的方式进行读取并进行相应操作。另外对于加在非私有方法上的注解,我们可以使用Spring AOP切面编程的方式进行读取。对于加载类上的注解,我们可以在对象完成初始化之后,通过借助处理器BeanPostProcessor来读取注解。

相关文章
|
16天前
|
XML Java 编译器
Java学习十六—掌握注解:让编程更简单
Java 注解(Annotation)是一种特殊的语法结构,可以在代码中嵌入元数据。它们不直接影响代码的运行,但可以通过工具和框架提供额外的信息,帮助在编译、部署或运行时进行处理。
83 43
Java学习十六—掌握注解:让编程更简单
|
11天前
|
Java 开发者 Spring
[Java]自定义注解
本文介绍了Java中的四个元注解(@Target、@Retention、@Documented、@Inherited)及其使用方法,并详细讲解了自定义注解的定义和使用细节。文章还提到了Spring框架中的@AliasFor注解,通过示例帮助读者更好地理解和应用这些注解。文中强调了注解的生命周期、继承性和文档化特性,适合初学者和进阶开发者参考。
34 14
|
11天前
|
前端开发 Java
[Java]讲解@CallerSensitive注解
本文介绍了 `@CallerSensitive` 注解及其作用,通过 `Reflection.getCallerClass()` 方法返回调用方的 Class 对象。文章还详细解释了如何通过配置 VM Options 使自定义类被启动类加载器加载,以识别该注解。涉及的 VM Options 包括 `-Xbootclasspath`、`-Xbootclasspath/a` 和 `-Xbootclasspath/p`。最后,推荐了几篇关于 ClassLoader 的详细文章,供读者进一步学习。
26 12
|
4天前
|
Java 编译器
Java进阶之标准注解
Java进阶之标准注解
16 0
|
1月前
|
JSON Java 数据库
java 常用注解大全、注解笔记
关于Java常用注解的大全和笔记,涵盖了实体类、JSON处理、HTTP请求映射等多个方面的注解使用。
34 0
java 常用注解大全、注解笔记
|
2月前
|
Arthas Java 测试技术
Java字节码文件、组成,jclasslib插件、阿里arthas工具,Java注解
Java字节码文件、组成、详解、分析;常用工具,jclasslib插件、阿里arthas工具;如何定位线上问题;Java注解
Java字节码文件、组成,jclasslib插件、阿里arthas工具,Java注解
|
22天前
|
IDE Java 编译器
java的反射与注解
java的反射与注解
14 0
|
2月前
|
Java 编译器 程序员
Java注解,元注解,自定义注解的使用
本文讲解了Java中注解的概念和作用,包括基本注解的用法(@Override, @Deprecated, @SuppressWarnings, @SafeVarargs, @FunctionalInterface),Java提供的元注解(@Retention, @Target, @Documented, @Inherited),以及如何自定义注解并通过反射获取注解信息。
Java注解,元注解,自定义注解的使用
|
1月前
|
XML Java 数据格式
Java-spring注解的作用
Java-spring注解的作用
20 0
|
2月前
|
Java 数据库连接 数据格式
【Java笔记+踩坑】Spring基础2——IOC,DI注解开发、整合Mybatis,Junit
IOC/DI配置管理DruidDataSource和properties、核心容器的创建、获取bean的方式、spring注解开发、注解开发管理第三方bean、Spring整合Mybatis和Junit
【Java笔记+踩坑】Spring基础2——IOC,DI注解开发、整合Mybatis,Junit