文章目录
Annotation:在JDK 1.5之后增加的一个新特性,这种特性被称为元数据特性,在JDK 1.5之后称为注释,即:使用注释的方式加入一些程序的信息。java. lang. annotation. Annotation接口是所有的Annotation 都必须实现的接口。
系统内建的Annotation
1.@Override
@Overide表示方法覆写的正确性,
class Person{
public String getInfo(){ // 取得信息
return "这是一个Person类。" ;
}
};
class Student extends Person{ // 继承此类
@Override
public String getinfo(){ // 覆写方法
return "这是一个Student类。" ;
}
};
public class OverrideAnnotationDemo01{
public static void main(String args[]){
Person per = new Student() ;
System.out.println(per.getInfo()) ; // 输出信息
}
};
此时,可能存在某种失误,将方法名称编写错误。
所以使用Override注释就可以保证程序的正确性
2.@Deprecated
使用@Deprecated注释的Annotation 本身是不建议使用的一个操作。
class Demo{
@Deprecated // 声明不建议使用的操作
public String getInfo(){
return "这是一个Person类。" ;
}
};
public class DeprecatedAnnotationDemo01{
public static void main(String args[]){
Demo d = new Demo() ;
System.out.println(d.getInfo()) ;
}
};
以上的程序编译并没有错误,而是出了一个错误的安全警告信息。
注: DeprecatedAnnotationDemo01.java使用或覆盖了已过时的 API。
注: 有关详细信息, 请使用 -Xlint:deprecation 重新编译。
@Deprecated不但可以声明一个方法,还可以声明一个类
@Deprecated // 声明不建议使用的操作
class Demo{
public String getInfo(){
return "这是一个Person类。" ;
}
};
public class DeprecatedAnnotationDemo02{
public static void main(String args[]){
Demo d = new Demo() ;
System.out.println(d.getInfo()) ;
}
};
3.@SuppressWarnings
用于压制警告信息。
以之前的泛型操作为例,在泛型中如果没有指定泛型类型,则使用时肯定出现安全警告。
class Demo<T>{
private T var ;
public T getVar(){
return this.var ;
}
public void setVar(T var){
this.var = var ;
}
};
public class SuppressWarningsAnnotationDemo01{
@SuppressWarnings("unchecked")
public static void main(String args[]){
Demo d = new Demo() ;
d.setVar("张三") ;
System.out.println("内容:" + d.getVar()) ;
}
};
出现安全经过信息
注: SuppressWarningsAnnotationDemo01.java使用了未经检查或不安全的操作。
注: 有关详细信息, 请使用 -Xlint:unchecked 重新编译。
此时就可以使用SuppressWarnings 这个Annontation将这种警告信息进行压制。
以上只是压制了一个警告信息,当然,也可以同时压制多个警告信息,只需要以数组的形式出现即可。。
通过刚才发现SuppressWarnings注释可以发现里面是使用value 的字符串数组接收的,所以,在传入注释参数的时候也可以明确的指出要传给那个变量接收。。
自定义的Annotation
定义一个简单的Annotation
之后就可以直接在程序中使用“@Annotation名称”的格式。
此时就表示在Demo类上使用Annotation。
在使用的时候就必须清楚的指名,变量的内容。
或者也可以使用明确的标记,表示内容赋给哪个参数
以上的参数是要赋给value属性的。。
既然可以设置一个参数,则也就可以同时设置多个参数。
此Annotation在使用的时候需要设置两个参数,一个是key,另外一个是value。
也可以数组一个数组进去
接收的内容本身是一个数组类型, 要传递数组,类似与之前的SuppressWarmings
以上所定义的全部的Anotation 中有一个特点,所有的参数内容需要在使用注释的时候设置上去,
那么也可以为一个参数设置默认的内容,在声明的时候使用default 即可。
当在去使用此Annotation的时候就可以不用设置内容。
没有设置内容,编译也不会出现任何的错误
在操作中,对于一个Annotation 而言有时候会固定其取值范围,只能取固定的几个值,那么这个时候实际上就需要依靠枚举。
以后的Annotation的取值,只能从这三个值中取走。
此时以上的Annotation 已经设置好了一个枚举中的内容作为默认值,那么外部使用此Annotation 的时候也需要从枚举固定内容
Retention和RetentionPolicy
在三个范围中,最需要的关心的就是RUNTIME范围,因为在执行的时候起作用。使用Rentention指定一个Annotation的范围,范围为RUNTIME范围。
此Annotation可以在运行时起作用,而且在以后要讲解反射与Annotation的操作中,也必须使用此种范围
反射与Annotation
一个Annotation 如果要是想让其变得有意义,则必须结合反射机制取得Annotation 中设置的全部内容
同时设置了三个Annotation, 那么此时注意,只有Depreacted的Annotation的定义范围是RUNTIME范围,所以此时通过反射的话只能取得一个。 。
此时,已经取得了一个Annotation。
以上的操作代码实际上是通过三个系统内建的Annotation完成的,那么也可以自定义一个Annotation.
以上的Annotation范围是在运行时依然有效,下面定义-一个类使用此Annotation.
下面使用反射取得指定的Annotation, 因为现在唯一设置内容的就是 MyDefault AnnotationRelfect.
深入理解Annotation
之前定义的Annotation,如果没有明确的说明可以在任意的位置上使用。
如果现在需要指定其使用的范围的话,则就必须使用@Target 注释。
@Targe
现在定义一个Annotation,只能在类上使用,类型是TYPE
此时在SimpleBean的类及方法的声明上使用此Annotation
编译错误,因为声明的是使用到类上…
如果现在希望一个Annotation 可以在类及方法上同时使用的话,则必须设置多个范围:
@Documented
@Documented可以用在任何的Annotation. 上 使用。所有的Annotation 默认情况下都是使用@Documented进行注释的,而且在生成java doc 的时候可以通过@Documented设置-些说明信息。
成功之后,在使用此Annotation的时候就可以增加一些信息上去。
之后通过java doc 命令,生成java的doc文档…
@Inherited
@Inherited注释,此注释表示一个 Annotation是否可以被继承下来。
定义一个父类,在父类上使用此Annotation
定义子类,继承父类
按照所解释的,使用Inherited 声明的Annotation 是可以被子类继承下来的。
可以去得Annotation的内容,所以验证成功