package cn.JAVandReflection.AnnotationTest;
import java.lang.annotation.*;
/**
* 介绍什么是注解,以及自定义注解:
* Annotation:
* 作用:方便阅读程序、 对程序的检查和约束、 可以被其他程序读取(如用反射操作注解,ORM内部的一些原理等下一期讲解)作用对象:
* 注解可以作用在包、类、方法、属性等上面
* 常见注解:
* @Override
* @Deprecated <:不赞成、反对> 不推荐使用某个方法等时使用
* @FunctionalInterface 函数式接口使用
* 本质: 接口
* 理解概念:
* 元注解: 用于描述注解的注解 单词: meta-annotation
* 常见的元注解:
* @Target : 用于描述注解的作用范围,即被描述的注解可以作用在什么地方,是类、方法亦或是变量
* @Retention: <:保留>表示什么级别保存该注解信息,用于描述注解的生命周期 三个周期: SOURCE < CLASS < RUNTIME
* 注意: 自定义的一般都是 RUNTIME
* @Document: 说明该注解是否被博阿寒在javadoc中
* @Inherited: <:继承的>表明子类可以继承父类的注解
* 自定义注解: 用下面代码简单理解
*/
// 下面自定义一个注解
@Target(value = {ElementType.FIELD, ElementType.TYPE})
/**
* ElementType 这个枚举类型里面限制了我们要使用的字段:但是常用的有以下几个
* .TYPE 表示作用域是类
* .FIELD 表示作用域是变量
* .METHOD 表示作用域是方法
* 可以同时设置作用多个作用域
*/
@Retention(value = RetentionPolicy.RUNTIME)
/*
RetentionPlicy 同样枚举类型 至于三个 SOURCE CLASS RUNTIME
*/
@Documented // 表示转成文档时候保留
@Inherited // 表示子类可以继承该注解
@interface myAnnocation { // 这个名就是注解名
// 里面写注解描述参数即可,他们是参数,但是样子像方法
String name();
String id();
int age() default 18; // 可以这样的形式设置一个默认值
// 以下这个仅演示可行性
char[] a() default {'d', 'b'};
}
// 通过上面方式简单定义了一个注解 注解的基本使用如下
/*
注意点: 定义过的注解参数而且没有设置默认值的必须像@Retention(value = RetentionPolicy.RUNTIME)
写上,但是 @Retention(RetentionPolicy.RUNTIME) 你们可能看见遮掩的形式:
因为, 在注解参数只有一个,且其名字为value时候,可以省略写,下面是上面的省略写法
*/
// 简单使用 这样就可以注解啦 ,当然 我们的作用域还有变量,我们也可以在变量上使用
@myAnnocation(name="WhatAnnotation Class", id="001")
public class WhatAnnotation {
// 这样是可行
@myAnnocation(name="name field", id="001-1")
String name ;
public WhatAnnotation() {
}
}