一、注解
1.什么是注解?
注解:解释给机器看的 注释:解释给人看的
1.1注解的含义
1.Java注解(Annotation)又称Java标注,是JDK5.0引入的一种注释机制。
2.Java语言当中的类、方法、变量、参数和包等都可以被标注。和javadoc不同,java注解可以通过反射获取注解的内容。
3.注解的生命周期:在编译器生成class文件时,注解可以被嵌入到字节码当中。java虚拟机jvm可以保留注解内容,在运行时候可以获取到注解内容。
4.支持自定义注解
1.2注解的类型
1.2.1内置注解:作用在代码的注解有3个
- @Override -- 检查该方法是否重写。
- @Deprecated -- 表示不鼓励程序员使用 通常是因为他很危险或者存在更好的选择 但是也是可以使用的
- @SpressWarmings --用来抑制编译时的警告信息(指示编译器去忽略注解中声明的警告)。
值得注意的是: 不同于上诉两个注解 这个注解是需要给定参数的。
@SpressWarmings("all");
@SpressWarmings("unchecked");
@SpressWarmings(value={"unchecked","deprecation"})。。。。。
1.2.2 元注解
元注解的作用是负责注解其他注解
内容:
@Target --表示这个注解的目标是哪里 (被秒速的注解可以用在那些地方)
@Retention --表示需要在什么级别保存 ,用于描述注解的生命周期
(SOURCE>CLASS>RUNTIME)
@Document -- 表示这些注解是否会被包含在javadoc文档当中
@Inherited --表示这个注解是继承与那个注解类
1.3如何自定义注解
使用@interface 自定义注解 ,会自动继承了java.lang.annotation.Annotation接口
格式: public @ interface 注解名{
注解参数: 参数类型 + 参数名 + ();
}
注意:虽然注解参数的格式像方法的格式 但是他是参数不是方法;
1.3.1无参数的注解
//无参数的注解
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation01{
}
没有设置参数的注解 使用的时候也不用设置参数
1.3.2有一个参数的注解
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation02{
String value();
}
设置一个参数的注解在使用时
1 参数名可以直接使用“value”
2可以不用输入”value=“,直接输入值就ok
1.3.3有多个参数类型的注解
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation03{
//注解参数: 参数类型 + 参数名 +()+;
String name();
int id ();
String[] schools();
}
有设置多个参数的注解 在使用的时候注意
1 要输入参数类型 以及对应的值
2 要完整的输入参数
3 可以不用注意顺序
1.3.4有参数默认值的注解
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation04{
String name() default "默认值";
int id() default 3;
String[] schools();
}
有默认值的参数可以不用输入,只需显示输入参数就可以
2.为什么要用注解?
作用:1起检查和约束的作用2 简便代码
3.怎么使用注解?
3.1使用无参数的注解
@MyAnnotation01
public static void testMyAnnotation01(){
System.out.println("MyAnnotation01注解没有设置参数应用是不用填写参数");
}
3.2使用有参数的注解
@MyAnnotation02("2号")
public static void testMyAnnotation02(){
System.out.println("MyAnnotaion02注解值设置一个参数 参数名就用value设置 在应用时可以不用写”value=“直接写”value的值“ ");
}
3.3使用有多个参数的注解
//2自定义注解时设置的参数就必须在应用时填写参数
@MyAnnotation03(name="3号",schools = {"清华大学","北京大学"},id=18)
public static void testMyAnnotation03){
System.out.println("MyAnnotation03注解设置了参数 应用时就必须填写完整 且参数的顺序可以调换");
}
3.4使用多个参数且设置默认值的注解
@MyAnnotation04(schools={"复旦大学","南京大学"},name="4号")
public static void testMyAnnotation04(){
System.out.println("MyAnnotation04注解参数当中设置了默认值 1有默认值在应用参数时可以不用填写参数值 ;2也可以显示的填写参数值 ;3但是没有设置参数值的一定要填写");
}
4注解的架构
4.1Annotation 组成部分
java Annotation 的组成中,有 3 个非常重要的主干类:
1 Annotation.java
package java.lang.annotation;
public interface Annotation {
boolean equals(Object obj);
int hashCode();
String toString();
Class<? extends Annotation> annotationType();
}
2 ElementType.java
package java.lang.annotation;
public enum ElementType {
TYPE, /* 类、接口(包括注释类型)或枚举声明 */
FIELD, /* 字段声明(包括枚举常量) */
METHOD, /* 方法声明 */
PARAMETER, /* 参数声明 */
CONSTRUCTOR, /* 构造方法声明 */
LOCAL_VARIABLE, /* 局部变量声明 */
ANNOTATION_TYPE, /* 注释类型声明 */
PACKAGE /* 包声明 */
}
3 RetentionPolicy.java
package java.lang.annotation;
public enum RetentionPolicy {
SOURCE, /* Annotation信息仅存在于编译器处理期间,编译器处理完之后就没有该Annotation信息了 */
CLASS, /* 编译器将Annotation存储于类对应的.class文件中。默认行为 */
RUNTIME /* 编译器将Annotation存储于class文件中,并且可由JVM读入 */
}
说明:
(1)Annotation就是一个接口。
每一个Annotation对象,都会有唯一PetentionPolicy属性,多个ElementType属性。
(2) ElementType 是 Enum 枚举类型,它用来指定 Annotation 的类型。
"每 1 个 Annotation" 都与 "1~n 个 ElementType" 关联。
当 Annotation 与某个 ElementType 关联时,就意味着:Annotation有了某种用途。例如,若一个 Annotation 对象是 METHOD 类型,则该 Annotation 只能用来修饰方法。
(3) RetentionPolicy 是 Enum 枚举类型,它用来指定 Annotation 的策略。通俗点说,就是不同 RetentionPolicy 类型的 Annotation 的作用域不同。
"每 1 个 Annotation" 都与 "1 个 RetentionPolicy" 关联。
- 若 Annotation 的类型为 SOURCE,则意味着:Annotation 仅存在于编译器处理期间,编译器处理完之后,该 Annotation 就没用了。 例如," @Override" 标志就是一个 Annotation。当它修饰一个方法的时候,就意味着该方法覆盖父类的方法;并且在编译期间会进行语法检查!编译器处理完后,"@Override" 就没有任何作用了。
- 若 Annotation 的类型为 CLASS,则意味着:编译器将 Annotation 存储于类对应的 .class 文件中,它是 Annotation 的默认行为。
- 若 Annotation 的类型为 RUNTIME,则意味着:编译器将 Annotation 存储于 class 文件中,并且可由JVM读入。