1.注解
- 注解也称元数据,是在代码中添加信息的一种方式添加的信息提供给编译器或者工具类框架使用。
- SE5引入,可以提供用来完整描述程序所需要的信息,往往这些信息是无法用Java来表达的。
- 注解可以在编译期的到检查。
- Java内置了三种标准注解
- @Override 确保重载方法的方法签名正确性
- @Deprecated 废弃此元素,如果使用会发出警告
- @SuppressWarnings 关闭不当的编译警告信息
2.定义注解
- 定义注解和定义接口相似,注解和其他类一样会被编译成class文件。
- 定义一个Test注解,注解和类,接口一样,一个.java 文件中只能有一个public 注解
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface Test {}
- 元注解:用来声明自定义注解用于什么地方
- 注解中一般都有元素来表示某些值,没有元素就叫 标记注解 如 @Test 而且使用时可以不用加()
3 .元注解
- 用来解释自定义注解的注解,表示自定义注解应该用到什么地方,作用,生命周期等。
- 有四个元注解 @Target @Retention @ Documented @Inherited
- @Target 表示注解该用在什么地方
@Target(ElementType.TYPE) //接口、类、枚举、注解 @Target(ElementType.FIELD) //字段、枚举的常量 @Target(ElementType.METHOD) //方法 @Target(ElementType.PARAMETER) //方法参数 @Target(ElementType.CONSTRUCTOR) //构造函数 @Target(ElementType.LOCAL_VARIABLE)//局部变量 @Target(ElementType.ANNOTATION_TYPE)//注解 @Target(ElementType.PACKAGE) ///包
- @Retention 注解的保存策略,在哪个阶段保存注解信息
@Retention(RetentionPolicy.SOURCE) //注解仅存在于源码中,在class字节码文件中不包含 @Retention(RetentionPolicy.CLASS) // 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得, @Retention(RetentionPolicy.RUNTIME) // 注解会在class字节码文件中存在,在运行时可以通过反射获取到
- @ Documented 将此注解包含在javadoc文件中
- @Inherited 允许子类继承父类注解。
4.注解元素
- 注解元素可用类型有 : 基本数据类型,String , Class ,enum,Annotation 和 以上类型的数组
- 注解元素不能是任何包装器类 和普通类。
- 定义注解元素和定义方法类似都有个()
- 每个元素不能有不确定的值,要么在使用时赋值,要么提供一个默认值。
- 注解只有一个元素此元素名称一定是value,使用的时候可以不写出名称直接赋值如@Test(" Hi ")
- 如果有多个元素赋值就得使用“名称 = 值” 赋值,value赋值也要写出value,没在()中出现的就取默认值。
public @interface Test { public String value() default "lpk"; public String des() default ""; public int id() default -1; public Class c() ; } class People{ @Test(value = "ooaa",c = People.class) //id取默认值 public void fun(){ } }
因为元素必须有值,可以 取一些特殊值表示一个元素的缺失状态如 id = -1 ,des = 取空字符串 ""
5.使用注解
- 在使用注解的元素前面加上注解即可
- 一个注解不能继承另一个注解
6.注解处理器
- 注解处理器一般利用反射来获取注解信息,生成代码提供给工具类和框架使用。
- AnnotatedElement 接口 表示当前在此VM中运行的程序的注解元素。 该允许反射读取注解。
- Class,Field,Method 都实现了该接口。