1、 基本注解
一、注解的概念
1、注解也叫元数据,是JDK1.5版本开始引入的一个特性,用于对代码进行说明,可以对包、类、接口、字段、方法参数、局部变量等进行注解。注解的形式是“@+单词”。 在不改变原有逻辑的情况下,使用注解在源文件中嵌入一-些补充信息。
2、其实同class、interface一样,注解也是一种类型。
二、注解的作用
(1)生成文档,通过代码里标识的元数据生成javadoc文档。
(2)编译检查,通过代码里标识的元数据让编译器在编译期间进行检查验证。
(3)编译时动态处理,编译时通过代码里标识的元数据动态处理,例如动态生成代码。
(4)运行时动态处理,运行时通过代码里标识的元数据动态处理,例如使用反射注入实例。
三、三种类型的注解
(1)第一类是Java自带的标准注解。
@Override:告诉编译器检查当前方法是否覆盖了父类的方法。
@Deprecated:标示该 方法已经过时,在高版本的代码中进行调用,编译该方法时会进行警告。
@SuppressWarnings:抑制编译器警告,取消显示的编译器警告信息。
@ Override举例:
Student类的父类是Object类,Object类含有toString()方法,不含有study()方法
@Deprecated举例:
代码:
public class Student {
//标记此方法已经过时,在高版本的类中调用此方法时,会显示“过时”警告信息
@Deprecated
public void study(){
}
}
@SuppressWarnings举例:
public class Student {
//抹除因为没有启用泛型产生的警告
@SuppressWarnings("rawtypes")
public List list=new ArrayList();
}
@SuppressWarning可以定义成员属性,也可以定义类。
2 、元注解
第二类是元注解(Meta Annotation),也就是用于定义注解的注解。
@Target:用于指定被修饰的Annotation可用于什么地方
@Retention:表示需要在什么级别保存该注解信息
@Documented:表示该注解包含在Javadoc中
@Inherited:允许子类继承父类中的注解
1、@Target:指定了注解应用的地方,取值如下:
ElementType.ANNOTATION_TYPE:可以给一个注解进行注解
ElementType.TYPE:可以给接口、类、枚举等进行注解
ElementType.FIELD:可以给字段、枚举的常量注解
ElementType.METHOD:可以给方法注解
ElementType.PARAMETER:可以给方法参数注解
ElementType.cONSTRUCTOR:可以给构造方法注解
ElementType.LOCAL_VARIABLE:可以给局部变量注解
ElementType.PACKAGE:可以给包进行注解
2、@Retention:当Retention应用到某个注解上表示该注解的存活时间,取值如下:
RetentionPolicy.soURCE:注解只存在源码阶段,编译器编译时注解失效。
RetentionPolicy.CLASS:注解保留到编译进行的时候,并不会被加载到JVM中。
RetentionPolicy.RUNTIME:注解保留到程序进行的时候,会被加裁到JVM中,在程序运行的时候可以获取这些注解信息。
3、 自定义注解-1
第三类是自定义注解,根据自己的需求定义注解,并可用元注解对自定义注解进行注解。语法:
public @interface 注解名称{ }
根据Annotaion是否包含成员变量,可以把注解分成两类:
(1)标记注解:没有成员变量的注解类型,该类型注解只提供存在与否的标识信息,例如@Override
(2)元数据注解:包含成员变量的注解,该类型注解可以接受更多的元数据。
代码:
package cn.edu.xync.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType. TYPE) //表明该自定叉注解可以应用到什么位置
@Retention(RetentionPolicy.RUNTIME) //表明该注解能存活到什么时候
public @interface MyAnnotation {
//此时该注解为空,表明该自定义注解是一个标记注解
String name(); //注解中定义的成员变量后面必须加括号(看着像定义方法)
int age(); //包含了成员变量的注解称为元数据注解
//成员变量的访问权限只能是共有或者缺省,不能是私有或者受保护
}
在Student类中使用注解@MyAnnotation
总结:
在Java中,如果你声明了一个变量但没有给它赋初始值,那么这个变量将被赋予默认值。以下是一些常见数据类型的默认值:整型(byte、short、int、long)、浮点型(float、double)、字符型(char)、布尔型(boolean)、引用类型(对象、数组),
这些默认值在Java中被称为缺省值,它们在变量声明时自动赋予,可以通过明确赋值来覆盖这些缺省值。
4、 自定义注解-2
自定义注解设置默认值,在使用时,可以不赋值
修改:@Target(ElementType. METHOD)
public interface MyInterface {
@MyAnnotation
void work();
}
修改:@Target(ElementType. FIELD)
public class Student implements Serializable {
//抹除因为没有启用泛型产生的警告
@SuppressWarnings("rawtypes")
@MyAnnotation
public List list=new ArrayList();
}
5、 自定义注解-3
修改:@Target(ElementType.CONSTRUCTOR)
package cn.edu.xync.annotation;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
@SuppressWarnings("serial")
//元数据注解需要给成员变量赋值
public class Student implements Serializable {
//抹除因为没有启用泛型产生的警告
@SuppressWarnings("rawtypes")
public List list=new ArrayList();
private String name;
private int age;
@Override
public String toString() {
return "";
}
@Deprecated
public void study(){
}
@MyAnnotation(name="李四",age=20)
public Student(){
super();
}
@MyAnnotation(name="李四",age=20)
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
}
修改:@Target(ElementType.PARAMETER)
@Deprecated
public void study(@MyAnnotation(name="李四",age=20) String type){
}