1.什么是注解 注解是一种代码级别的说明。他是jdk1.5以后引入的一个特性,与类,接口,枚举在同一个层次 2.作用 注释是给程序员提供相应的信息 注解是给计算机提(编译器,虚拟机,内存)供相应的信息 例如: 检查编译:通过代码里标识注解,让编译器实现基本的编译检查,Override 代码分析:通过代码里标识注解,让代码进行分析,从而达到取代xml的目次
编写文档:通过代码里标识注解,辅助生成帮助文档的内容
3.jdk提供的注解有哪些 @Deprecated表识被修饰的方法已经过时,过时的方法不建议使用,但仍可以使用 一别被标记过时的方法都存在缺陷 1安全问题 2新的api取代 @Override jdk5.0表示复写父类方法 jdk6.0还可以表示实现接口的方法
@SuppreWarnings表示抑制警告 被修饰的类或者方法如果存在编译警告,将被编译器忽略 deprecation 忽略过时 rawtypes 忽略类型不安全(泛型) unused 忽略不适用 unchecked 忽略安全检查 null 忽略控制 all 忽略所有 4.自己定义注解
@interface Anno_1 {
/*
* #1注解定义 关键字@interface
* #2属性定义
* * 格式:修饰符 类型 属性名() [default 默认值]
* ** 修饰符:public abstract
* ** 类型:1.基本类型、2.String、3.Class、4.Annotation注解、5.枚举enum ;以及以上类型的一维数组。
*/
public abstract String username() default "" ;
}
@interface Anno_2 {
public int num();
public String username();
public Class clazz();
public Anno_1 anno();
public Color_2 color();
public String[] hobby();
}
/**
*
* 和自定义枚举功能相似(多例)
*
*/
class Color_1{
public static final Color_1 red = new Color_1();
public static final Color_1 blue = new Color_1();
private Color_1(){
}
}
//jdk5 枚举--与上面内容等效的
enum Color_2{
red,blue;
}
5.使用自己定义的注解 属性使用,在目标对象(类名,构造方法,方法,字段)直接添加注解,以@开头 格式:@注解名称 @注解名称(属性名=值,属性名=值,。。。) 属性名: 1.如果属性名为value,且只有一个属性时,属性名可以省略 标准写法:@Anno_2(value="dzd") 省略:@Anno_2("dzd") 2.如果有多个属性时,value不能省略 @Anno_2(value="dzd",username="jack") 属性值: 1.如果属性的类型是数组,值需要使用{值1,值2,值3,} @Anno_2(hobby={"dzd","das","daf"}) 2.如果属性的类型是数组,只有一个值时,{}可省略 @Anno_2(hobby="dzd") 默认值:如果有默认值得属性可选,如果没有默认值的属性为必填 注意同一个注解,只能在同一个目标对象上使用一次
6.对自己定义的注解进行解析 如果给类,方法等添加注解,如果获得注解上设置的数据,那么我们就必须对注解进行解析,jdk提供了java.lang.reflect.annotatedElement接口允许在运行时通过放射获得注解
@Anno_1
class TestAnno{
public static void main(String[] args) {
boolean annotationPresent = TestAnno.class.isAnnotationPresent(Anno_1.class);
System.out.println(annotationPresent);
}
}
当运行上面程序后,我们希望输出结果是true,但实际上是false,TestAnno类上有@Anno_1,但运行后不能获得,因为每一个自定义注解,需要jdk提供的元注解(用于修饰注解的注解)进行修饰,才可以真正的使用
6.修饰注解的注解--元注解 定义:用于修饰自定义注解的jdk提供的注解 jdk提供4中元注解 @Retention 用于确定被修饰的自定义注解的生命周期 RetentionPolicy.SOURCE 被修饰的注解只能够存在源码中,字节码中没有,用途提供给编译器使用 RetentionPolicy.CLASS 被修饰的注解只能存在源码和字节码中,运行时内存没有,用途:java虚拟机使用 RetentionPolicy.RUNTIME被修饰的注解存在于源码,字节码,内存,用途取代xml @Target用于确定被修饰的自定义注解使用位置 ElementType.TYPE 修饰类,接口 ElementType.CONSTRUCTOR修饰构造方法 ElementType.METHOD修饰方法 ElementType.FIELD修饰字段
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.ElementType;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface Anno_1 {
}
@Anno_1
class TestAnno{
public static void main(String[] args) {
boolean annotationPresent = TestAnno.class.isAnnotationPresent(Anno_1.class);
System.out.println(annotationPresent);
}
}
输出结果为true