java注解是什么
java中的注解其实很简单,可以理解为给元素(类、属性、方法、等)打tag(标签),同时注解可以带一些属性,这些属性可以有默认值
在运行时(runtime),我们可以通过反射获取元素的注解,根据元素的注解以及注解的属性进行相应的操作。
java内置注解
内置注解我想大家都很熟悉了
- @Override 声明这是一个方法重写
- @Deprecated 声明这个方法已经过期
- @SuppressWarnings 声明忽略警告
自定义注解
@Documented
@Target(ElementType.METHOD)
@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation{
String author() default "unkown";
int revision() default 1;
}
- @Document 如果生命了@Document,表明声明这个注解的元素应该被包含近javadoc
- @Target 声明这个注解可以声明在什么元素上
- @Inherited 表明这个注解的属性是否可以被继承
- @Retention 表明这个注解持续到什么阶段有效
- SOURCE 源码
- CLASS 字节码
- RUNTIME 运行时
几个例子
@override注解用与声明该方法是方法重写,提供编译时的检查,所以适用元素是方法@Target(ElementType.METHOD)
有效阶段是源码阶段
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
@RequestParam spring mvc 中我们经常会使用的@RequestParam注解,基本原理就是在调用controller的方法时,检查参数,如果一个参数声明了@RequestParam, 那么就执行request.getParameter(“name”),获取参数并赋值给该参数。
@RequestParam 适用元素时方法参数@Target(ElementType.PARAMETER),有效阶段肯定时运行时@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestParam {
//some property and default value
}
@Retention 是字节码的例子没想到。。
获取类注解信息
@MyAnnotation(author = "1286")
public class Boot {
public static void main(String[] args) {
for (Annotation annotation : Boot.class.getAnnotations()) {
System.out.println(annotation);
}
}
}
@Documented
@Target(ElementType.TYPE)
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation {
String author() default "unkown";
int revision() default 1;
}
/*
输出
@MyAnnotation(author=1286, revision=1)
*/