1.注解的简单介绍
1.从jdk5.0开始,java增加了对于元数据(MetaData)的支持,也就是Annotation(注解)
2.Annotation也就是代码里的特殊标记,这些标记可以在编译类加载,运行时被读取,并且执行相应的处理。通过使用Annotation,程序员可以在不改变原有逻辑的情况下在源文件中嵌入一些补充信息
3.Annotation可以像修饰符一样被使用,可以用于修饰包,类,构造器,方法,成员变量,参数,局部变量的声明,这些信息保存在Annotation的"name=value"对中
4.Annotation能用来为程序元素(类,方法,成员变量等)设置元数据,在使用注解时要在前面添加@符号,并且把该Annotation当作一个修饰符使用,用于修饰它支持的元素
2.基本的注解类型
基本的注解类型(五个) java7 java8各新增一个 @Override 限定重写父类方法,该注释只能用于方法 @Deprecated 用于表示某个程序元素(类,方法等)已经过时 权衡新旧版本之间的兼容性 @SuppressWarnings 抑制编译器警告 Java7 @SafeVarargs 抑制堆污染的警告(堆污染:把一个无泛型的对象赋给了一个有泛型的对象) Java8 @FunctionalInterface 用来修饰只含有一个抽象方法的接口(函数式接口) ,可以含多个static和default方法
2-1:@Override 重写父类方法时使用
ep:
public class TestAnnotation {
public static void main(String[]args){
Teacher t1=new Student();
t1.eat();
t1.run();
}
}
class Teacher{
public void run(){
System.out.println("老师跑步");
}
public void eat(){
System.out.println("老师吃饭");
}
}
class Student extends Teacher{
@Override
public void run(){
System.out.println("学生跑步");
}
@Override
public void eat(){
System.out.println("学生吃饭");
}
}
2-2:@Deprecated 表示一些因更新而逐渐过时的方法或者类
ep:
public class TestAnnotation {
public static void main(String[]args){
Teacher t1=new Student();
t1.eat();
t1.run();
}
}
class Teacher{
@Deprecated 表明已经过时
public void run(){
System.out.println("老师跑步");
}
public void eat(){
System.out.println("老师吃饭");
}
}
class Student extends Teacher{
@Override
public void run(){
System.out.println("学生跑步");
}
@Override
public void eat(){
System.out.println("学生吃饭");
}
}
2-3:@SuppressWarnings
为了给有“洁癖”的同学使用,如果一旦存在编译器进行警告时,可以使用该注释来屏蔽警告
public static void main(String[]args){
@SuppressWarnings("unchecked")
int i=0;
Teacher t1=new Student();
t1.eat();
t1.run();
}
2-4:@SafeVarargs 修饰构造器和方法,防止“堆污染”
堆污染:当把一个不带泛型的对象赋给了一个带泛型的变量时,往往会发生堆污染
public class ListDemo {
@SafeVarargs //抑制堆污染警告 但是程序依旧会出错
public static void faultyMethod(List<String>...listStrArray){
List[]listArray=listStrArray;
List<Integer>mList=new ArrayList<Integer>();
mList.add(new Random().nextInt(100));
listArray[0]=mList;
String s=listStrArray[0].get(0);
}
public static void main(String[]args){
ListDemo.faultyMethod(Arrays.asList("Hello"),Arrays.asList("World"));
}
}
2-5:@Functionallnterface 修饰接口,表示该接口中只有一个抽象方法(可以有多个默认方法或静态方法)
@FunctionalInterface
public interface FunInterface {
static void foo(){
System.out.println("类方法");
}
default void bar(){
System.out.println("默认方法");
}
void fun();
}
3.如何自定义注解呢?
ps:可以仿照基础注解来构造一个
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
//自定义注解
public @interface MyAnnotation {
String value() default "Annotation";
}
@MyAnnotation(value = "myFirstAnnotation")
class Student extends Teacher{
@Override
public void run(){
System.out.println("学生跑步");
}
@Override
public void eat(){
System.out.println("学生吃饭");
}
}
4.元注解的介绍
简单的来说,就是给注解的注解(用来对注解进行补充)
JDK5.0提供了专门在注解上的注解类型 分别为
Retention
Target
Documented
Inherited
@Target 表示该注解用于什么地方,可能的值在枚举类 ElemenetType 中,包括:
ElemenetType.CONSTRUCTOR----------------------------构造器声明
ElemenetType.FIELD --------------------------------------域声明(包括 enum 实例)
ElemenetType.LOCAL_VARIABLE------------------------- 局部变量声明
ElemenetType.METHOD ----------------------------------方法声明
ElemenetType.PACKAGE --------------------------------- 包声明
ElemenetType.PARAMETER ------------------------------参数声明
ElemenetType.TYPE--------------------------------------- 类,接口(包括注解类型)或enum声明
@Retention 表示在什么级别保存该注解信息。可选的参数值在枚举类型 RetentionPolicy 中,包括:
RetentionPolicy.SOURCE ---------------------------------注解将被编译器丢弃
RetentionPolicy.CLASS -----------------------------------注解在class文件中可用,但会被VM丢弃
RetentionPolicy.RUNTIME VM-------将在运行期也保留注释,因此可以通过反射机制读取注解的信息。
@Documented 将此注解包含在 javadoc 中 ,它代表着此注解会被javadoc工具提取成文档。在doc文档中的内容会因为此注解的信息内容不同而不同。
@Inherited 允许子类继承父类中的注解。
详细使用方法请参考这位博主写的,https://blog.csdn.net/qq_32371887/article/details/72832928