1. java se 5.0 引入annotation的概念
2. java 中常见的几个注解:
1) @Override 表示子类要重写父类的方法
2)@Deprecated 表示方法是不建议被使用的
3)@SuppressWarnings注解表示压制警告
3. 如何定义自己的Annotaion类型
1) 使用@interface来定义,实际上是自动继承了java.lang.annotation.Annotation接口。
定义时,不定继承其他Annotation形态或接口
public @interface AnnotationTest {2)给其增加成员变量
}
public @interface AnnotationTest {
//如果指定的名字是value时,则在应用中赋值时,
//可以不用显示的写是给value赋值,其他value一外的名字,都必须显示的写出是给谁赋值
//比如:@AnnotationTest(value1="hello")
//给value设置默认值default "hello"
String value() default "hello";
}
3) 增加一个枚举型的成员变量
public @interface AnnotationTest {
//给value设置默认值default "hello"
String value() default "hello";
//在使用时 @AnnotationTest(value2=EnumTest.Hello)
EnumTest value2();
}
enum EnumTest{
Hello,World,Welcome
}
以上就定义了一个自己的Annotation类型,但没什么实际用处!
4. 用@Retention(java.lang.annotation.RetentionPolicy)注解来修饰自己定义的Annotation类型
@Retention指示编译程序该如何对待你自己定义的Annotation类型。
有三种类型:
1. SOURCE //编译程序处理完Annotation信息后就完成任务,例如:@SuppressWarnings
2. CLASS,//编译曾需将Annotation储存在Class文件中,是缺省情况
3.RUNTIME//编译程序将Annotation储存于class文件中,可由vm读入
Demo如下:
1) 定义一个自己的Annotation,并使用@Retention来修饰
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
String hello() default "sehngsiyuan";
String world();
}
2) 定义一个测试类MyTest,来使用自己的Annotation类型
@MyAnnotation(hello="beijing",world="shanghai")
public class MyTest {
@MyAnnotation(hello="hello",world="beijing")
public void output(){
System.out.println("Hello world!");
}
}
3)利用反射机制类来读取测试类MyTest中的注解,学习的重点
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
public class MyReflection {
/**
* 获得方法上面的注解信息
* @param args
*/
public static void main(String[] args)throws Exception {
//得到一个目标类对象
MyTest myTest = new MyTest();
//得到目标类所对应的Class类的对象
Class<MyTest> c = MyTest.class;
//利用反射机制从Class类对象中得到目标类对象的output方法
Method method = c.getMethod("output", new Class[]{});
//判断目标类对象的output方法 上面是否存在注解MyAnnotation,如果存在返回为true,否则返回false;
if(method.isAnnotationPresent(MyAnnotation.class)){
//执行目标类对象的output方法
method.invoke(myTest, new Object[]{});
//得到方法上面的注解对象MyAnnotation
MyAnnotation myAnnotation = method.getAnnotation(MyAnnotation.class);
//得到其变量
String hello = myAnnotation.hello();
String world = myAnnotation.world();
System.out.println(hello+","+world);
}
//只会得到RetentionPolicy设置为RUNTIME的注解对象
Annotation [] annotations = method.getAnnotations();
for(Annotation annotation:annotations){
System.out.println(annotation.annotationType().toString());
}
}
}
5. 使用java.lang.annotation.Target可以定义自己定义的Annotation的使用时机
在定义时要指定java.lang.annotation.ElementType的枚举值之一。
例如:
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)//ElementType.Method表示该注解只能修饰方法
public @interface MyTarget {
String value();
}
以下列出ElementType的多有类型:
TYPE//class,interface,enum
FIELD,//适用field
PARAMETER//适用method上的parameter
CONSTRUCTOR//适用构造方法
LOCAL_VARIABLE//适用局部变量
ANNOTATION_TYPE//适用annotation形态
PACKAGE//适用package
6. 如果想要在适用者制作javaDoc文件的同时,也一并将Annotation的讯息加入到Api文件中,使用java.lang.annotation.Docuented
例如:
@Documented//该注解表示将DocumentedAnnotation在适用类中的注解信息加入到api文档中
public @interface DocumentedAnnotation {
String hello();
}
测试类
public class DocumentedTest {
@DocumentedAnnotation(hello="welcome")
public void method(){
System.out.println("hello world");
}
}
则生成的DocumentedTest类的api文件中,method()方法的头上将出现注解
@DocumentedAnnotation(hello="welcome")字样。
小技巧:
在myeclipse中生成注解的方法:projectàgenerate javadoc