JDK1.5新特性:注解
相当于一种标记,加上注解就等同加上了某种标记,以后javac编译器、开发工具和其他程序可以用反射来了解这个类及各种元素上有无何种标记。有什么标记、就去干相应的事
标记可以加在:包、类、字段、方法、方法的参数以及局部变量上
java.lang包,可看到JDK中提供的最基本的Annotation
@Override 表示当前方法是覆盖父类的方法。
@Deprecated 表示当前元素是不赞成使用的(过时的)
@SuppressWarnings 表示关闭一些不当的编译器警告信息
注解也相当于一个特殊的类
注解的应用结构图:
注解类 应用了“注解类”的类 对“应用了注解的类”进行反射操作的类
@interface A{ @A class C{
} class B{ ...} B.class.isAnnotationPresent(A.class);
A a = B.class.getAnnotation(A.class);
}
元注解:为注解提供服务的注解称为~
@Retention(RetentionPolicy.RUNTIME)
它的作用:使注解一直保留到一个时期,决定注解的生命周期,默认是CLASS
RetentionPolicy是一个枚举,其中有三种取值:
取值 分别对应
RetentionPolicy.SOURCE --> java源文件
RetentionPolicy.CLASS --> class文件
RetentionPolicy.RUNTIME --> 内存中的字节码
当编译器编译java源文件时,可能会把“没用的”注解从中去掉,编译成class
当使用该类时,类加载器把class文件加载到内存中时,也会把“没用的”注解从中去掉,生成内存中的字节码
-------------------------------------------
@Retention(RetentionPolicy.RUNTIME) //指定注解生命周期
@Target({ElementType.METHOD,ElementType.TYPE}) //指定注解作用的范围
public @interface MyAnnotation {
}
-------------------------------------------
java自带的3个注解:
@Override --> SOURCE
@SupperessWarning -->SOURCE
@Deprecated --> RUNTIME
@Target(ElementType.METHOD) 注解:
指定注解的作用范围,如方法前,等
-------------------------------------------
@MyAnnotation
public class AnnotationTest {
@SuppressWarnings("deprecation")
public static void main(String[] args) {
// TODO Auto-generated method stub
System.runFinalizersOnExit(true); //过时方法
sayHello();//过时方法
if(AnnotationTest.class.isAnnotationPresent(MyAnnotation.class)){ //哪个注解在不在
MyAnnotation annotation = AnnotationTest.class.getAnnotation(MyAnnotation.class);
System.out.println(annotation);
}
}
@Deprecated
public static void sayHello(){
System.out.println("你好");
}
-------------------------------------------
JDK1.5中,Interface Type接口
Class也实现了该接口,Type更准确,包含:Class interface enum