1、注解的基础
Java注解的基础为4个元注解:Retention
,Target
,Inherited
,Documented
。
Retention: 表明注解可以存在到的周期,有三个选项:source(源码),class(字节码),runtime(运行时),默认为class,表示从class文件到JVM中运行时,该注解会被丢弃。
public @interface Retention {
RetentionPolicy value();
}
public enum RetentionPolicy {
SOURCE,
CLASS,
RUNTIME
}
Target: 表明注解可以作用到的位置,可选的值有:类,方法,变量,参数,构造器…
public @interface Target {
ElementType[] value();
}
public enum ElementType {
/** 类 */
TYPE,
/** 变量 */
FIELD,
/** 方法 */
METHOD,
/** 参数 */
PARAMETER,
/** 构造器 */
CONSTRUCTOR,
/** 局部变量 */
LOCAL_VARIABLE,
/** 注解 */
ANNOTATION_TYPE,
/** 包 */
PACKAGE,
/** 类型参数 */
TYPE_PARAMETER,
/** 类型使用 */
TYPE_USE
}
Inherited: 被修饰的类的子类可以通过class文件的 getAnnotations ()方法来获得父类的注解。
Documented: 被修饰的注解会生成到Javadoc中。
2、注解如何写
@Target( { ElementType.METHOD,ElementType.TYPE})// 作用方法
@Retention(RetentionPolicy.RUNTIME) // 生命周期时间
@Documented // 可以被生成Javadoc
@Inherited // 可以通过被注解的子类查询到
public @interface MyAnnotation {
String value() default "";
}
@MyAnnotation("today")
public class MyAnnotationTest {
public static void main(String[] args) throws Exception{
Class<?> zClass = MyAnnotationTest.class;
MyAnnotation annotation = zClass.getAnnotation(MyAnnotation.class);
System.out.println(annotation);
System.out.println(annotation.value());
}
}
# 输出结果
@geek.spring.hello.hellospring.MyAnnotation(value=today)
toady
通过以上例子,我们可以通过反射来得到注解和注解内的属性。
常用的关于注解的方法:
方法名称 | 方法名称 | 说明 |
---|---|---|
<A extends Annotation> | getAnnotation(Class annotationClass) | 指定注解类型,有则返回这些注解,否则返回 null。 |
Annotation[] | getAnnotations() | 返回存在的所有注解,包括从父类继承的。 |
boolean | isAnnotationPresent(Class annotationClass) | 指定类型的注解存在于此元素上,则返回 true,否则返回 false。 |
Annotation[] | getDeclaredAnnotations() | 返回直接存在于此元素上的所有注解,但是不包括父类的注解 |
3、注解的作用
1.编译检查
例如 @SuppressWarnings(抑制编译器给我们warning信息), @Deprecated 和 @Override (被注解的方法被覆盖)。
2.反射使用
这个上面也看到了,可以去试试。
3.生成文档
@Document能使得注解生成javadoc文档中
4.辅助程序员
例如注解@override,@Deprecated(方法过期,废弃不再使用),能很好地帮助我们理解程序。
4、Java自带注解
Java除了上面的4个基础元注解之外,还有6个基本注解,分别是 @Override , @Deprecated , @SuppressWarnings , @SafeVarargs , @FunctionalInterface , @Repeatable 。
-
@Override - 检查该方法是否是重写方法
-
@Deprecated - 标记过时方法。
-
@SuppressWarnings - 指示编译器去忽略注解处出现的警告。
-
@SafeVarargs - Java 7 开始支持,忽略任何使用参数为泛型变量的方法或构造函数调用产生的警告。
-
@FunctionalInterface - Java 8 开始支持,标识一个匿名函数或函数式接口。
-
@Repeatable - Java 8 开始支持,标识某注解可以在同一个声明上使用多次。