一、概念
Annontation是Java5开始引入的新特征。中文名称一般叫注解。它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程序元素(类、方法、成员变量等)进行关联。更通俗的意思是为程序的元素(类、方法、成员变量)加上更直观更明了的说明,这些说明信息是与程序的业务逻辑无关,并且是供指定的工具或框架使用的。
Annontation像一种修饰符一样,应用于包、类型、构造方法、方法、成员变量、参数及本地变量的声明语句中。
java.lang.annotation.Annotation接口是所有的Annotation都必须实现的接口。
系统内建的Annotation
@Override
java.lang.Override 是一个marker annotation类型,它被用作标注方法。它说明了被标注的方法重载了父类的方法,起到了断言的作用。如果我们使用了这种annotation在一个没有覆盖父类方法的方法时,java编译器将以一个编译错误来警示。
class Person{ public String getInfo(){ // 取得信息 return "这是一个Person类。" ; }};class Student extends Person{ // 继承此类 @Override public String getinfo(){ // 覆写方法 return "这是一个Student类。" ; }};public class OverrideAnnotationDemo{ public static void main(String args[]){ Person per = new Student() ; System.out.println(per.getInfo()) ; // 输出信息 }};
使用@Override注释可以保证程序的正确执行
@Deprecated
Deprecated也是一种marker annotation。当一个类型或者类型成员使用@Deprecated修饰的话,编译器将不鼓励使用这个被标注的程序元素。所以使用这种修饰具有一定的 “延续性”:如果我们在代码中通过继承或者覆盖的方式使用了这个过时的类型或者成员,虽然继承或者覆盖后的类型或者成员并不是被声明为@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()) ; }};
@SuppressWarnings
此注解能告诉Java编译器关闭对类、方法及成员变量的警告。有时编译时会提出一些警告,对于这些警告有的隐藏着Bug,有的是无法避免的,对于某些不想看到的警告信息,可以通过这个注解来屏蔽。
SuppressWarning不是一个marker annotation。它有一个类型为String[]的成员,这个成员的值为被禁止的警告名。对于javac编译器来讲,被-Xlint选项有效的警告名也同样对@SuppressWarings有效,同时编译器忽略掉无法识别的警告名。
@Deprecatedclass Demo<T>{ private T var ; public T getVar(){ return this.var ; } public void setVar(T var){ this.var = var ; }};public class SuppressWarningsAnnotationDemo03{ @SuppressWarnings(value={"unchecked","deprecation"}) public static void main(String args[]){ Demo d = new Demo() ; d.setVar("偶my耶") ; System.out.println("内容:" + d.getVar()) ; }};
反射与annontation
如果想要一个Annotation起作用必须要有反射机制
示例如下
package org.lxh.demo16.reflectannotation ;public class SimpleBeanOne{ @SuppressWarnings("unchecked") @Deprecated @Override public String toString(){ return "Hello oumyye!!!" ; }};
同时设置三个Annotation,那么此时注意,只有Deprecated的Annotation的定义范围是RUNTIME范围,所以此时通过反射的话只能取得一个。
import java.lang.annotation.Annotation ;import java.lang.reflect.Method ;public class ReflectDemo01{ public static void main(String args[]) throws Exception{ // 所有异常抛出 Class <?> c = null ; c = Class.forName("org.lxh.demo16.reflectannotation.SimpleBeanOne") ; Method toM = c.getMethod("toString") ; // 找到toString()方法 Annotation an[] = toM.getAnnotations() ; // 取得全部的Annotation for(Annotation a:an){ // 使用 foreach输出 System.out.println(a) ; } }};
此时,已经取得一个Annotation。
- 1楼禅楼望月
- mark……见你每天都在学习。真羡慕啊……哈哈……
- Re: 偶my耶
- @禅楼望月,彼此彼此,,看你也是在每天学习!!