1,什么是java注解。
注解(Annotation),也叫元数据,标签,注释。注解有时候,也叫注释,但是容易和java的注释// /**/混淆, 一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。
2,为什么要学注解
(1,因为java框架基本都用的注解,用注解很方便,不用到处翻配置文件查看配置,不懂注解就看不懂框架的配置。
(2,别人写的代码中有注解,不懂注解看不懂代码。
3,注解的作用
①编写文档:通过代码里标识的元数据生成文档【生成文档doc文档】比如api文档;
②代码分析:通过代码里标识的元数据对代码进行分析【使用反射】
(可以通过反射 看这个类有没有注解,有注解的时候,代码应该怎么写,没有注解的时候,应该怎么写)
③编译检查:通过代码里标识的元数据让编译器能够实现基本的编译检查【Override】
第二种用处最大。
4,注解的用法
@+注解的名称
比如@Override,@WebServlet
这些注解可以放在类上面,方法上面,方法里面。
5,元注解
元注解是写给注解的注解,用于规定和解释注解。
常用的元注解:
@Retention : 生命长度(涉及到一个Java文件从开始-编译-运行 整个生命周期)
@Target : 使用范围(常用)
@Documented : 文档 (简单了解)
@Inherited :继承(简单了解)
6,自定义一个注解类,格式就是public @interface name{}
自定义了一个注解类,名为Vip。
package xin.wangjinlong.anno;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
//元注解Target,规定了这个注解只能用在类上
@Target(ElementType.TYPE)
//元注解Retention,规定了这个注解可以存活到运行时期
@Retention(RetentionPolicy.RUNTIME)
public @interface Vip {
//给自定义注解配置了一个属性叫做value,可以接收String类型的值,默认值为false
String value() default "false";
}
7,给两个类打上自定义的注解
package xin.wangjinlong.beans;
import xin.wangjinlong.anno.Vip;
@Vip
public class Admin {
String adminName;
String adminPassword;
public String getAdminName() {
return adminName;
}
public void setAdminName(String adminName) {
this.adminName = adminName;
}
public String getAdminPassword() {
return adminPassword;
}
public void setAdminPassword(String adminPassword) {
this.adminPassword = adminPassword;
}
}
给value赋值为true
package xin.wangjinlong.beans;
import xin.wangjinlong.anno.Vip;
@Vip("true")
public class User {
String username;
String password;
int age;
String email;
String sex;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
测试类,获取有注解类的class,然后获取到value的值,判断值是多少,打印出该类是不是VIP。一般地,注解的具体实现都是第三方实现,程序员负责用。
package xin.wangjinlong.test;
import xin.wangjinlong.anno.Vip;
import xin.wangjinlong.beans.Admin;
public class test03 {
public static void main(String[] args) {
Class clz = Admin.class;
Vip annotation = (Vip)clz.getAnnotation(Vip.class);
if(annotation != null){
if("true".equals(annotation.value())){
System.out.println("你是VIP");
}else{
System.out.println("你不是VIP");
}
}
}
}
从上面的例子中推断出JavaWeb开发中@WebServlet 注解的实现方式
1,获取到request中的请求行,得到用户请求的资源路径
2,用上一步中获得的资源路径与@WebServlet中的value值对比,相同的话就执行该注解的方法