1.1,注解的基本介绍:
1,注解,或者叫注释,英文单词是:Annotation
2,注解Annotation是一种引用数据类型。编译之后也是生成xxx.class文件
3,注解怎么定义:
语法格式:
[修饰符列表] @interface 注解类型名{
}
4,注解怎么使用,用在什么地方?
第一:注解使用时的语法格式是:
@注解类型名
第二:注解可以出现在类上,属性上,方法上,变量上等......
注解还可以出现在注解上。
代码示例:
自定义一个注解:
package annotation;
public @interface MyAnnotation {
}
注解的使用:
package annotation;
@MyAnnotation
public class Test {
@MyAnnotation
private String name;
@MyAnnotation
public Test() {
}
@MyAnnotation
public static void m1(){
@MyAnnotation
int i=100;
}
}
1.2,注解的属性:
我们通常会在注解当中定义属性,
注意: 如果一个注解中有属性,那么必须给属性赋值。
可以给一个默认值,使用时可以不写。(赋默认值如下例)
如何给属性赋值?
在使用时通过:@注解类型名(属性名=属性值)的形式给属性赋值
注意:如果属性名时value,并且只有一个属性的话,在使用时,该属性名可以省略。
注解当中的属性可以时哪一种类型?
属性的类型可以是:
八种基本数据类型,String,Class,枚举类型,Annotation类型
Java有两种对象:实例对象和Class对象。每个类的运行时的类型信息就是用Class对象表示的
注意:属性也可以是数组(数组算是一种数据结构,里面的元素是Java的数据类型元素)。
对数组属性赋值的时候使用:属性名={属性值,属性值.....}
如果数组属性的属性值只有一个可以省略{}。
package annotation;
public @interface MyAnnotation {
String name() default "";
String[] value() default {};
String[] urlPatterns() default {};
int loadOnStartup() default -1;
}
package annotation;
@MyAnnotation(flag = true)
public class Test {
}
2,注解的分类
1,按照运行机制分:
源码注解:注解只在源码中存在,编译成.class文件之后就不存在了。
编译时注解:在源码以及.class文件中都存在,例如上面讲的三个jdk的注解,只在编译时起作用,例如@Override,在编译的时候告诉编译器我要覆盖父类的方法,如果没有覆盖就会报错
运行时注解:在运行时还起作用,甚至会影响程序运行的逻辑的注解,比如spring的@Autowired,就会在程序运行的时候把成员变量自动的注入进来
2,按照来源分:
来自jdk的注解
来自第三方的注解(运用最多)
自定义注解
3,元注解:给注解进行注解
3,JDK内置了哪些注解?
掌握:
1, Deprecated
@Deprecated: 用于表示某个程序元素(类,方法等)已过时
如果使用 Deprecated 去修饰一个类,表示这个类已经过时了,但过时不代表不能用了,即不推荐使用,仍然可以使用。
不鼓励程序员使用这样的元素,通常是因为它很危险或存在更好的选择。
2, Override
@Override:表示方法声明的时候打算重写超类中的另一个方法的声明。
在编译的时候告诉编译器我要覆盖父类的方法,如果没有覆盖就会报错
3,SuppressWarnings
@SuppressWarnings :该批注的作用是给编译器一条指令,
告诉它对被批注的代码元素(以及元素内部)的某些警告保持静默。
4,JDK常见的元注解:
1, 什么是元注解?
用来标注"注解类型"的"注解",称为元注解。
2,常见的元注解有哪些?
Target
Retention
Target注解:
这是一个元注解,用来标注“注解类型”的“注解”。
Target注解用来标注“被标注的注解”可以出现在哪些位置上。
ElementType是个枚举。属性作用如下:
TYPE:接口、类、枚举
FIELD:字段、枚举的常量
METHOD:方法
PARAMETER:方法参数
CONSTRUCTOR:构造函数
LOCAL_VARIABLE:局部变量
ANNOTATION_TYPE:注解
PACKAGE:包
如:@Target(ElementType.METHOD):表示“被标注的注解”只能出现在方法上。
Retention
这是一个元注解,用来标注“注解类型”的“注解”。
这个注解用来标注“被标注的注解”最终保存在哪里。
1、RetentionPolicy.SOURCE:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃;
2、RetentionPolicy.CLASS:注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期;
3、RetentionPolicy.RUNTIME:注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在;
这3个生命周期分别对应于:Java源文件(.java文件) ---> .class文件 ---> 内存中的字节码。
5,获取注解对象
获取注解对象其实就是为了更好的操作类,作为一个标记。
第一步:通过反射机制,获取类,
第二步: 获取对象之前,可以判断是否存在该注解
使用Class对象的isAnnotationPresent()方法。
第二步:通过类的getAnnotation()方法获取注解对象。
注意:可以通过:注解对象.value();的方式获取注解对象的属性
以下例子中:WebServlet也是一个注解。
package com.javaweb.servlet;
import javax.servlet.annotation.WebServlet;
public class ReflectAnnotation {
public static void main(String[] args) throws ClassNotFoundException {
//使用反射机制将类上面注解 进行解析。
//获取类Class对象
Class<?> aClass = Class.forName("com.javaweb.servlet.WelcomServlet");
//获取这个类上面的注解
//先判断这个类上面有没有这个注解对象,如果有这个注解对象,就获取该注解对象
//boolean annotationPresent = aClass.isAnnotationPresent( WebServlet.class);
//System.out.println(annotationPresent);
if (aClass.isAnnotationPresent( WebServlet.class)) {
//获取这个类上面的注解对象
WebServlet annotation = aClass.getAnnotation(WebServlet.class);
// System.out.println(annotation);
//获取注解的value属性值
String[] value = annotation.value();
for (String s : value) {
System.out.println(s);
}
}
}
}