网站首页 > java教程 正文
第一节:注解的作用
Annotation(注解)是JDK5.0及以后版本引入的。它的作用是修饰编程元素。什么是编程元素呢?例如:包、类、构造方法、方法、成员变量等。
第二节:注解的作者
注解是JDK 5.0推出来的,这部分JDK源码的作者是:Joshua Bloch,这是一个技术大牛。Collections Framework皆是他一手打造,还获得了当年的Jolt大奖。另外,他还写了一本非常出名的书:《Effective Java》,相信大家不会陌生吧。如果没有读过这本书,赶紧读一读吧。关于更多Joshua Bloch的故事,后期【Java人生】将会单独撰文介绍,这里不再赘述了。
第三节:注解的语法与定义形式
(1)以@interface关键字定义
(2)注解包含成员,成员以无参数的方法的形式被声明。其方法名和返回值定义了该成员的名字和类型。
(3)成员赋值是通过@Annotation(name=value)的形式。
(4)注解需要标明注解的生命周期,注解的修饰目标等信息,这些信息是通过元注解实现。
上面的语法不容易理解,下面通过例子来说明一下,这个例子就是Target注解的源码,
@Retention(value = RetentionPolicy.RUNTIME)
@Target(value = { ElementType.ANNOTATION_TYPE } )
public @interface Target
{
ElementType[] value();
}
源码分析如下:
第一:元注解@Retention,成员value的值为RetentionPolicy.RUNTIME。
第二:元注解@Target,成员value是个数组,用{}形式赋值,值为
ElementType.ANNOTATION_TYPE
第三:成员名称为value,类型为ElementType[]
另外,需要注意一下,如果成员名称是value,在赋值过程中可以简写。如果成员类型为数组,但是只赋值一个元素,则也可以简写。如上面的简写形式为:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
第四节:注解的分类
注解分为两类,一类是元注解,另外一类是普通注解。所谓元注解就是修饰注解的注解。拿到一个注解,如何知道它是否是元注解呢?需要看它的元注解(无论是元注解还是普通注解都是有元注解的),如果看到这样的元注解:@Target(
ElementType.ANNOTATION_TYPE),那么此时这个注解一定是元注解。
第五节:注解的生命周期
注解的定义语法中已经说到了:注解需要标明注解的生命周期,这些信息是通过元注解实现。而这个元注解是:
public @interface Retention
{
RetentionPolicy value();
}
Retention注解的值是enum类型的RetentionPolicy。包括如下几种情况:
(1)SOURCE: 注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃。
(2)CLASS: 注解被保留到class文件,jvm加载class文件时候被遗弃。这是默认的生命周期。
(3)RUNTIME: 注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在,保存到class对象中,可以通过反射来获取。
第六节:注解的修饰目标
注解的定义语法中已经说到了:注解需要标明注解的修饰目标,这些信息是通过元注解实现。而这个元注解是:
public @interface Target
{
ElementType[] value();
}
这个注解的值是enum类型ElementType。包括以下几种情况:
(1)TYPE:指的是在类,接口(包括注解)或者enum上使用的注解。
(2)FIELD:指的在field属性,也包括enum常量使用的注解。
(3)METHOD:指的是在方法声明上使用的注解。
(4)PARAMETER:指的是在参数上使用的注解,
(5)CONSTRUCTOR: 指的是在构造器使用的注解。
(6)LOCAL_VARIABLE:指的是在局部变量上使用的注解。
(7)ANNOTATION_TYPE:指的是在注解上使用的元注解
(8)PACKAGE:指的是在包上使用的注解。
第七节:注解的底层实现
定义一个注解:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Cache
{
String value() default "cache";
}
分析其字节码,如下图所示:
分析上面的字节码,我们可以得出:
第一:
public interface Cache extends
java.lang.annotation.Annotation,说明Cache注解是继承自Annotation,仍然是interface。
第二:
public abstract java.lang.String value(),说明value方法是abstract类型。
本文由【Java人生】原创编译,欢迎大家关注,后续会推出更多有深度的技术文章。
- 上一篇: 哥,厉害,一文讲完了Spring的各种注解...
- 下一篇: VBA技术资料MF278:对集合进行排序
猜你喜欢
- 2025-04-24 Spring 最常用的 7 大类注解,史上最强整理
- 2025-04-24 哥,厉害,一文讲完了Spring的各种注解...
- 2025-04-24 Java注解的高级用法:从入门到精通
- 2025-04-24 小技巧,IDEA中创建类时,如何自动给类加注释?
- 2025-04-24 SpringBoot 常用注解总结超详细
- 2025-04-24 Java @Data注解
- 2025-04-24 学会在代码中写注释
- 2025-04-24 java代码助理之注释
- 2025-04-24 Java 反射与注解详解
- 2025-04-24 Java 注释
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)