注解概述:
注解是在JDK1.5之后出现的新特性,是提供给虚拟机查看的.注解可以让带吗看起来更加的简便
官方的注解定义:
注解也称为元数据:是一种具有代码级别的说明。它可以声明在类,方法,属性,包,局部变量,方法参数上面。用来对元素进行说明
注解的本质:
注解的本质就是一个接口,改接口默认继承Annotation接口
注解格式:@注解名称
注解作用:
在目前主流应用上住哟啊是替代配置文件(例如:xml文件,properties)。因为读取文件很耗费内存,所以一般都是注解开发减少内存损耗,加快效率
在Servlet2.5之前不支持注解开发----->在Servlet3.0之后就开始支持注解开发,自此我们就不需要在xml中去配置信息。因为注解开发替代了xml配置文件。
注解优点:开发速度快,代码精简度高
注解缺点: 代码耦合性太强,维护困难
常见的内置注解:(原生的注解)
-
@Override ------>在java,long包下面,表示这是重写的注解
-
@SuppressWarning------>在java,long包下面,告知编译器此处内部有警告信息.主要是为了抑制编译时警告信息.意思就是就是,避免代码之出现黄色警告就直接在类上写一个------@SuppressWarning(“all”)就不会出现黄色警告了
- 此注解需要搭配参数或者属性才能使用.
- 参数或者属性名称,value 参数类型是Stringp[]
- unused:代表未使用
- unchecked: 未检查(强制类型转换时泛型参数使用未指定),使用List,ArrayList,未检查警告
- deprecation : 这个是过时警告
- all:抑制全部警告
-
@Deprecated------>在java,long包下面,告知编译器此方法是过时的,不被鼓励使用的.可能有更好的方法替代了它.但是此方法依然可以使用的.
package com.zhiyou100.AnnoDemo;
import com.zhiyou100.pojo.People;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* 注解
*/
@SuppressWarnings("all")//最后只用记住all就够了
//@SuppressWarnings("unused")//未使用抑制警告num未使用贝莱有警告,加入此注解之后,警告姐没有了,可以丢在任何地方,如果丢在类上面那么就是整个类中所有未使用警告都会被抑制
public class AnnoDemo01 {
//@Override ------>在java,long包下面,告知编译器此方法是重写父类中的方法,
@Override//注意必须父类里面有才可以重写,父类里面没有不能重写
public String toString() {
return super.toString();
}
//@SuppressWarning------>在java,long包下面,告知编译器此处内部有警告信息.主要是为了抑制编译时警告信息.
@SuppressWarnings("unused")//未使用抑制警告num未使用贝莱有警告,加入此注解之后,警告姐没有了,可以丢在任何地方,如果丢在类上面那么就是整个类中所有未使用警告都会被抑制
public void methodA(){
int num = 0;
}
//获取所以的poeple信息
@SuppressWarnings({"unchecked","deprecation"})//未检查的和过时警告
public List<People> getPeople(){
return new ArrayList();//此时Arraylist未指定泛型所以报黄色,就是未检查
}
//@Deprecated------>在java,long包下面,告知编译器此方法是过时的,不被鼓励使用的.可能有更好的方法替代了它.但是此方法依然可以使用的.
}
常见的内置注解
- @Override 重写
- @Deprecated 过时
- @SuppressWarning 抑制警告
内置注解代码演示
@SuppressWarnings("all")
public class AnnoDemo01 {
public static void main(String[] args) {
}
//过时
@Deprecated //加了这根注解就表示这根方法是过时的,调用的时候就会出现,方法上面就会出现横线表示此方法已经过时
public static void addNum(int x, int y){
int z = x + y ;
System.out.println(z);
}
}
如何自定义注解 :就是自己定义一个注解也不知道有啥用,官方定义的都还学不完呢.
1.首先使用关键字 @Interface 注解的本质就是一个接口表示一个注解
//第一步就是把原先的class替换为@interface----------->或者直接在创建的时候就选择@Annotation选项,那么创建出来之后直接就是注解 替换之后依然是java文件
//注意任何注解都是继承于Annotation
public @interface MyAnnoDemo01 {
//注意以下不是抽象方法,在注解当中,这些称之为属性
//注解中属性格式:修饰符 数据类型 变量名();
//注意,在注解类里面的话 返回值不能使用void,否则就会报错
//public abstract void show();----->错误案例
String show();
int num() default 123;// -->数字类型 default 来给属性搞一个初始化值
String name();// -->字符串类型
Class getUser();
//注意自定义的类不能使用
2.注解属性格式: 修饰符 数据类型 属性名称(); —>属性的作用就是为了给注解提供更详细的信息
3.如果在自定义属性的时候我选哪个要给熟悉初始化值 就要使用default关键字----
格式:属性名称() default 默认值;
4.注意事项:在注解里面修饰符只能是—>public abstract ----->所以修饰符是可以忽略的,会默认添加
5.注解里面的数据类型可以包含
- 基本数据类型(四类八种)
- String
- 枚举类型 enum
- 注解类型
- Class类型
- 以上数组的一维数组类型
*/
public @interface MyInnotation {
//首先是基本数据类型
int num() default 0;
double decimal() default 0.0;
//其次是String
String name() default "绍绍";
//枚举类型 People是一个枚举类
People PEOPLE();
//字节类型
Class cls() default Class.class;
//注解类型 MyAnnoDemo01是一个注解类
MyAnnoDemo01 Ano_01();
//一维数组,以此类推
int[] nums();
//如果注解里面没有value属性 只有其他属性 使用格式 @MyInnotation(属性名1 = {},属性名2 = {},......)
//如果只有一个value属性,和一个其他的属性 使用格式 @MyInnotation({},属性名1 = {} ---->此处value可以省略
//如果有一个value和很多属性 使用格式 @MyInnotation(value = {},属性名1 = {},属性名2 = {},......) --->此处value属性不能省略
//属性名字为value----->那么我们在使用这个注解的时候就会出现小括号里面必须加东西
//如果注解里面只有单独的属性value,使用的时候就应该 @MyInnotation({})
String[] value();
6.特殊的属性名字为value();
如果注解里面没有value属性 性 使用格式 @MyInnotation(属性名1 = {},属性名2 = {},…)
如果只有一个value属性,和一个其他的属性 使用格式 @MyInnotation({},属性名1 = {} ---->此处value可以省略
如果有一个value和很多属性 使用格式 @MyInnotation(value = {},属性名1 = {},属性名2 = {},…) —>此处value属性不能省略
属性名字为value----->那么我们在使用这个注解的时候就会出现小括号里面必须加东西
如果注解里面只有单独的属性value,使用的时候就应该 @MyInnotation({})
7.如何使用注解(重点)
- 在类.方法.成员变量.局部变量.非法参数上添加注解,格式:@注解名称(属性名1 = 属性值1,属性名2 = 属性值2,…)
8.元注解负责注解其他注解:控制自定义的注解,并说明
- 在Java中有四个元注解,他们是用来提供其他注解说明和限制
- Documented
- Inherited
- Native
- Repeatable
- Retention
- target
- @Target(重点)----->主要就是控制注解使用位置.就是注解只能写在那些位置,写在其他位置不可以.-------->只能在注解上使用不能在类上面使用,一般情况下我们一般都是在类,方法,局部变量,成员变量,属性,方法参数这些地方使用注解.
- FIELD: 字段上可以使用
- METHOD:方法上可以使用
- PARAMETER:参数上可以使用
- TYPE:类、接口、枚举、注解上可以使用
- CONSTRUCTOR:构造方法上面可以使用
- LOCAL_VARIABLE:局部变量可以使用
- TYPE_PARAMETER:表示注解可以用于类型参数声明时(1.8引入的)
- TYPE_USE:类型使用说明(1.8引入的)
Retention(重点)———>代表注解可见范围,表示需要在上面级别保存改信息,用于描述注解的生命周期,借助RetentionPolicy级别,总共有三个值。
- 1 SOURCE 源码阶段可见
- 2 CLASS 在字节码文件级别可见,包i阔SOURCE级别
- 3 RUNTIME 在整个运行阶段可见,包括SOURCE 和 CLASS 可以通过反射获取(所以框架里面一般都是RUNTIME)
- 一般来说开发之中都是设置使用RUNTIME阶段。因为可以通过反射获取哦
@Target和@Retention
//表示能在字段(属性),方法,和构造方法上面使用
@Target({ElementType.FIELD,ElementType.METHOD,ElementType.CONSTRUCTOR})
//设置为在整个运行阶段可见,十分厉害一般来说都是没问题的
@Retention(RetentionPolicy.RUNTIME)
public @interface MyInotation02 {
}
@Retentiond的三个阶段图解
@Documented:说明该注解将会被包含在javadoc中,意思就是生成帮助文档的时候对应位置上含有注解信息
@Repeatable: 重复,一般来说一个注解在一个地方只能使用一次,但是如果自定义注解上面加了@Repeatable就能重复使用自定义注解。@Repeatable(注解名字.class)小括号里面必须事注解类型的(看代码这个需要),有了这个修饰之后,我们的注解就可以多次使用,元注解@Repeatable是在JDK1.8之后新引入的,表示在同一个位置重复相同的注解,如果没有该注解之前一般事无法在同一个位置上买你使用相同的注解,他的使用需要借助荣光其来存储此注解。从而达到此诸结可以被多次使用。
- Class< ? extends Annotation> 表示只能传Annotation以及他的子类
- Class< ? super Annotation> 表示只能传入Annotation以及他的父类
- Inherited: 表面子类可以继承父类中的注解。