来自董老师的课件总结
目录
1.略
2、系统定义的三个Annotation
在JDK 1.5之后,在系统中提供了三个Annotation,分别是:@Override、@Deprecated、@SuppressWarnings。
@Override
表示当前的方法定义将覆盖超类中的方法。如果你不小心拼写错误,或者方法签名对不上被覆盖的方法,编译器就会发出错误提示。
@Deprecated
表示的是一个类或方法已经不再建议继续使用了,标记为已过时。
@SuppressWarnings
表示关闭不当的编译器警告信息。
3、自定义Annotation
注解应用需要三个步骤:
(1)编写注解
(2)在类上应用注解
(3)对应用了注解的类进行反射操作的类
自定义Annotation的语法如下:
访问控制权限 @interface Annotation名称{}
例如:
public @interface MyAnnotation {}
在Annotation中定义变量
public @interface MyAnnotation {
public String name();
public String info();
}
定义变量后,在调用此Annotation时必须设置变量值。
@MyAnnotation(name = “XB", info = “WSDR")
public class Demo {
}
通过default指定变量默认值,有了默认值在使用时可以不设值
默认属性为value,给value属性赋值可省略属性名。
public @interface MyAnnotation {
public String name() default “XB";
public String info() default “WSDR";
}
定义一个变量的数组,接收一组参数
public @interface MyAnnotation {
public String[] name();
}
使用时指定数组值
@MyAnnotation(name = { “XB", “XH" })
public class Demo {
}
使用枚举限制变量取值范围
public enum Color {
RED, GREEN, BLUE
}
public @interface MyAnnotation {
public Color color();
}
4、Retention和RetentionPolicy
Annotation要想决定其作用的范围,通过@Retention指定,而Retention指定的范围由ReteiontPolicy决定,RetentionPolicy指定了三种范围:
范围 | 描述 |
public static final RetentionPolicy SOURCE | 在java源程序中存在 |
public static final RetentionPolicy CLASS | 在java生成的class中存在 |
public static final RetentionPolicy RUNTIME | 在java运行的时候存在 |
示列:
@Retention(value = RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
public String name();
}
5、反射与Annotation
一个Annotation真正起作用,必须结合反射机制,在反射中提供了以下的操作方法:java.lang.reflect.AccessibleObject
方法名称 | 描述 |
public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass) | 判断是否是指定的Annotation |
public Annotation[] getAnnotations() | 得到全部的Annotation |
示例:
6、@Documented注解
此注解表示的是文档化,可以在生成doc文档的时候添加注解。
@Documented
@Retention(value = RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
public String name();
public String info();
}
//可以增加一些DOC注释。
/**
* 这个方法是从Object类中覆写而来的
*/
@MyAnnotation(name = “XB", info = “WSDR")
public String toString() {
return "hello";
}
7、@Target注解
•@Target注解表示的是一个Annotation的使用范围,例如:之前定义的MyAnnotation可以在任意的位置上使用。
范围 | 描述 |
public static final ElementType TYPE | 只能在类或接口或枚举上使用 |
public static final ElementType FIELD | 在成员变量使用 |
public static final ElementType METHOD | 在方法中使用 |
public static final ElementType PARAMETER | 在参数上使用 |
public static final ElementType CONSTRUCTOR | 在构造中使用 |
public static final ElementType LOCAL_VARIABLE | 局部变量上使用 |
public static final ElementType ANNOTATION_TYPE | 只能在Annotation中使用 |
public static final ElementType PACKAGE | 只能在包中使用 |
8、@Inherited注解
@Inherited表示一个Annotation是否允许被其子类继承下来。
示例
@Inherited
@Target(value = ElementType.TYPE)
@Retention(value = RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
public String name();
public String info();
}
使用时允许被其子类所继承。