ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 第四章第二节--定义注解 标签(空格分隔): 廖雪峰 --- ## 如何定义: 使用@interface定义注解(Annatation) - 注解的参数类似无参数方法. - 可以设定一个默认值(推荐). - 把最常用的参数命名为Value(推荐). ![定义注解例子](http://p0b921qfc.bkt.clouddn.com/18-5-18/65827705.jpg) ## 元注解: 可以用来修饰其他注解的注解称为元注解. JDK已经注释了元注解我们只需要应用即可,无需自己定义元注解. 1. @Target 用来定义Annotation可以被应用的位置. - 类或者接口:ElementType.TYPE. - 字段:ElementType.FIFLD. - 方法:ElementType.METHOD. - 构造方法:ElementType.CONSTRUCTOR. - 方法参数:ElementType.PAPAMETER. 2. @Retention 用来定义Annotation的生命周期: - 仅编译器:RetentionPolicy.SOURCE. - 仅class文件:RetentionPolicy.CLASS. - 运行期:RetentionPolicy.RUNTIME. 如果@Retention不存在,则默认为仅编译文件RetentionPolicy.CLASS. 通常定义为Annotation为RetentionPolicy.RUNTIME. Annotation的声明周期: RetentionPolicy.SOURCE:是用来给编译器看的,编译完了直接丢弃. RetentionPolicy.CLASS:存储在class文件中,但是不会be被读取.有一些工具能够处理class文件再处理class文件的时候可以读取这些注解. RetentionPolicy.RUNTIME:在运行期我们可以通过代码来读取,这些Annotion 3. @Repeatable(JDK>1.8) 定义Annotation是否可以重复. ![重复例子](http://p0b921qfc.bkt.clouddn.com/18-5-18/17427947.jpg) 4. Inherited 定义子类是否可继承父类的Annotation. - 只能针对@Target为TYPE类型的Annotation - 仅仅正对class继承 - 对interface继承无效. ![继承例子](http://p0b921qfc.bkt.clouddn.com/18-5-18/66015170.jpg) ## 定义Annotation的步骤 - 第一步:使用@interface 定义一个注解. ![第一步](http://p0b921qfc.bkt.clouddn.com/18-5-18/77443627.jpg) - 第二步:使用元注解(meta Annotation)来配置这个注解.Target:必须设置,Retention:一般为RUNTIME.Inherited和Repeatable一般不用配置 ![添加元注解](http://p0b921qfc.bkt.clouddn.com/18-5-18/63267703.jpg) - 定义注解的默认值. ![定义值](http://p0b921qfc.bkt.clouddn.com/18-5-18/2437644.jpg) ## 小节小结 - 使用@interface定义注解. - 可定义多个参数和默认值,核心参数使用value名称. - 必须设置@Target来指定Annotation使用的范围. - 应当设置@Retention为RUNTIME便于运行时读取.