Java5开始 Java支持对元数据的支持, 就是是Annotation(注解)
元数据: metadata描述数据的数据
注解:标签 Annotation
所有的Annotation都是java.Lang.annotation.Annotation接口的子接口
所有Annotation是一种特殊的接口
既可以放在方法上,放在变量上,放在类或接口上
使用注解需要注意:必须有三个参与才有意义
1.有注解的本身
2.被放置的位置(类,属性,方法,接口,参数上,包等等)
3.由第三方程序使用反射的手段赋予注解特殊的功能
Java5之前自带注解
Java5中提供的
@Override –> 限定子类重写父类的方法,只能在方法上
@Deprecated –> 标记当前方法已经过时,不推荐使用 只能用在方法上
@SuppressWarings –> 抑制编译器发出多种警告
@SuppressWarings(value=”all”) 可以应用在方法,类,属性上
Java7中提供了一个
@SafeVarargs 抑制堆污染
当方法使用可变参数和泛型参数,此时就会造成堆污染 Arrays.asList
Java8中提供一个
@FunctionalInteFace 函数式编程 –>所用在接口上
元注解:
描述注解的注解,用来限定注解可以贴在哪些程序元素上,还可以指定注解存在的周期
@Retention: 表示注解可以保存在哪一个代码时期. 保存的时期的值,封装在RetentionPolicy枚举类中:
注意:一般的,自定义的注解,使用RUNTIME.(使用反射赋予注解功能)
SOUECE:注解只能存在于源文件中,一旦编译,在字节码中就消失了.
CLASS:(缺省),注解可以存在于源文件和字节码文件中,一旦加载进JVM,在JVM中就消失了.
RUNTIME:注解可以存在于源文件,字节码文件,JVM中.
@Target:表示注解可以贴在哪些位置(类,方法上,构造器上等等).
位置的常量封装在ElementType枚举类中:
ElementType.ANNOTATION_TYPE只能修饰Annotation
ElementType.CONSTRUCTOR只能修饰构造方法
ElementType.FIELD只能修饰字段(属性),包括枚举常量
ElementType.LOCAL_VARIABLE只能修饰局部变量
ElementType.METHOD只能修饰方法
ElementType.PACKAGE只能修饰包(极少使用)
ElementType.PARAMETER只能修饰参数
ElementType.TYPE只能修饰类,接口,枚举
实现自己的注解:
语法格式:
栗子:
public @interface 注解名{
注解中的成员:
抽象方法 -->(属性)
数据类型 方法名() default 默认值;
}
ps:Spring框架中–> 注解最多 –> 动态代理模式 –> 内省模式JavaBean和Map互转
栗子:
自定义注解:
@Retention(RetentionPolicy.RUNTIME) //注解的声明周期就是源文件 ,编译文件和 JVM中
@Target(ElementType.TYPE) //注解可以书写的位置 类,方法和接口
public @interface VIP{
//抽象方法
//可以在注解中声明的数据类型:基本数据类型,String,Class ,数组,枚举,Annotation
//声明的同时就赋值,此时在外部写书注解时就不需要赋值
String Value();
int age() defaul 19;
String[] favs();
}
//若自定注解在注解中声明抽象方法(属性),使用注解时就需要给当前注解中的抽象方法(属性)赋值
//若注解中使用了默认值,可以修改也可以不修改
@VIP(Value="A",age=19,favs = {"你好","呵呵"})
public class Student{
private String name;
private int age;
}
public class VIPDemo {
public static void main(String[] args) {
//1.获取Student上的所有注解(反射)
Annotation[] as = Student.class.getAnnotations();
for(int i = 0;i<as.length;i++) {
System.out.println(as[i]);
}
//2.获取Student真正的注解
//判断当前类是否存在指定注解
if(Student.class.isAnnotationPresent(VIP.class)) {
//获取注解对象
VIP vip = Student.class.getAnnotation(VIP.class);
String str = vip.Value();
String[] strs = vip.favs();
System.out.println(str);
System.out.println(Arrays.toString(strs));
}
}
}