注解
Java类提供的基本注解:
· @SuppressWarnings:取消警告。例如:当你调用了已经过时的方法时,编译器会警告你该方法已经过时。如果你认为这不是问题,可以加上@SuppressWarnings("deprecation")。压制这个警告
· @Override:覆盖父类。当要覆盖父类的方法时,可以在方法上加上这个注解,如果该方法没有覆盖父类中的方法,会报错。
· @Deprecated:被该注解标识的方法,代表该方法已经过时。
代码示例:
@SuppressWarnings("deprecation")
public static void main(String[] args) {
//这个类是过时的,使用@SuppressWarnings来压制警告
System.runFinalizersOnExit(true);
}
@Deprecated //该注解标识的类,代表该类已经过时
public static void sayHello() {
System.out.println("hello world");
}
@Override //该注解标识的类,代表的覆盖的是其父类的方法
public boolean equals(Object obj) {
return super.equals(obj);
}
了解注解:
注解相当于一种标记,加了注解就等于打上了某种标记,没加,则等于没有某种标记,以后,开发工具和其他程序可以用反射来了解你的类以及各元素上有无何种标记,看你有什么标记,就去干相应的事。标记可以加在包、类、字段、方法、方法的参数以及局部变量上。
在java.lang包,可以看到JDK提供的最基本的annotation
自定义注解:
· 在程序中写了一个注解的时候,就相当与调用了一个java类。这个类就是应用了注解类的类
· 对应用注解类的类,进行反射操作
· 元注解:对注解进行注解的类
1.Retention:这个接收一个枚举类型的参数RetentionPolicy,这个枚举有3个状态分别是:RUNTIME、SOURCE、CLASS。
SOURCE代表被注解的这个只保留在源文件中
CLASS代表被注解的这个类在被编译后,还会保留在class文件中。默认类型
RUNTIME代表这个类会一直被保留到运行时
例:@Override对应的Retention:SOURCE,只保留在源文件中,给编译器看的注解;@SuppressWarnings:SOURCE;@Deprecated:RUNTIME,保留到运行时的注解。
2.Target:接收一个ElementType类型的数组。代表定义的注解,使用在什么地方。ElementType也是一个枚举,常用的声明有:METHOD、PACKAGE、TYPE(类,接口或者枚举声明)、FIELD
例:@Target(ElementType.METHOD):这时定义的注解类就只能注解在方法上。如果,想同时注解在方法和类上:@Target({ElementType.METHOD,ElementType.TYPE})
通过反射的方式获取注解:
//如果指定类型的注解存在,则返回true
if(Demo.class.isAnnotationPresent(MyAnnotation.class)) {
//返回指定类型的注解,没有返回null
//也可以通过Class.forName反射获得一个类上的注解
MyAnnotation annotation = Demo.class.getAnnotation(MyAnnotation.class);
//返回该类上的所有注解
Annotation[] anntations = Class.forName("Demo").getAnnotations();
System.out.println(annotation);
}
为注解增加基本属性:
· 可以直接在注解类中写上:返回值类型 属性名() default 属性值。其中default为缺省值,可以不写,如果不写则在调用该注解的时候,需要把这个值的内容传递进去
· 注解中可以添加的基本属性有:8个基本类型,String类型,枚举类型,Class类型,注解类型,还可以是上面这些类型的数组
代码示例:
//一个注解类型,类型中只有一个String属性value
@interface DemoAnnotation {
String value();
}
//自定义注解类型
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation {
//为注解添加属性
//String类型属性
String value();
//数组类型属性
int[] arr() default {1,3,6};
//注解类型
DemoAnnotation annotation() default @DemoAnnotation("123");
}
@MyAnnotation(value="abc",arr=1)//当数组类型只有一个元素是,大括号可以省略不写
public class Demo2 {
public static void main(String[] args) {
if(Demo2.class.isAnnotationPresent(MyAnnotation.class)) {
MyAnnotation anno = Demo2.class.getAnnotation(MyAnnotation.class);
//调用注解的类型,因为注解是一个特殊的类,调用属性就像调用类的方法一样
System.out.println(anno.value());
System.out.println(anno.annotation().value());
System.out.println(anno.arr().length);
}
}
}