Annotation 注解
为什么要有这个东西?
注解,顾名思义,就是标注解释。类似书籍页下角的标注,给读者解释一些晦涩的东西或一些小提示。Annotation也是如此,用来给给程序员或编译器或jvm一些提示。
- 给程序员看,如 @Deprecated 表识被弃用的元素,开发者告诉使用者某些东西不希望再被使用。@Override表识重写父类方法。
- 给Java编译器看,如 @SafeVarargs让编译器忽略对泛型参数的报错 。 @SuppressWarnings让编译器忽略对传入的内容的检查。
- 给jvm看,如 @Inherited,在用户自定义注解时来启用继承,也就是说子类可以继承父类的注解。@Documented表识在javadoc中显示的注解。@Retention 表识注解的声明周期。 @Target表识注解的应用对象时那些。
Demo1 自定义注解
package spring.web.mvc.demo.java.lang.annotation;
import java.lang.annotation.*;
/**
* @Description 自定义java注解
* @author Fan Ruikang
**/
public @interface MyAnnotation {
}
Demo2 自定义注解的生命周期
package spring.web.mvc.demo.java.lang.annotation;
import java.lang.annotation.*;
/**
* @Description 定义注解的生命周期:源代码,class文件,还是二进制字节码。
**/
@Retention(RetentionPolicy.RUNTIME)
/**
* @Description 自定义java注解
* @author Fan Ruikang
**/
public @interface MyAnnotation {
}
Demo3 定义注解的应用场合
package spring.web.mvc.demo.java.lang.annotation;
import java.lang.annotation.*;
/**
* @Description 定义注解的应用场地:注解,构造函数,包,类,属性,方法,参数,本地变量
**/
@Target({ElementType.METHOD,ElementType.TYPE})
/**
* @Description 自定义java注解
*
* @author Fan Ruikang
**/
public @interface MyAnnotation {
}
Demo4 让注解可以被继承
package spring.web.mvc.demo.java.lang.annotation;
import java.lang.annotation.*;
/**
* @Description 定义注解继承性,默认不继承
**/
@Inherited
/**
* @Description 自定义java注解
* @author Fan Ruikang
**/
public @interface MyAnnotation {
}
Demo4的测试
package spring.web.mvc.demo.java.lang.annotation;
/**
* 〈功能简述〉
* 〈 测试Annotation的特性〉
*
* @author Fan Ruikang
* @version 1.0.0
* @create 2018/12/5 0005\
*/
public class MyAnnotationTest extends MyAnnotationTestFather{
public MyAnnotationTest() {
if (MyAnnotationTest.class.isAnnotationPresent(MyAnnotation.class)) {
MyAnnotation annotation = (MyAnnotation) MyAnnotationTest.class.getAnnotation(MyAnnotation.class);
System.out.println(annotation);
}
}
public static void main(String[] args) {
MyAnnotationTest myAnnotationTest = new MyAnnotationTest();
}
}
@MyAnnotation
class MyAnnotationTestFather {
public MyAnnotationTestFather() {
System.out.println("MyAnnotationTestFather" + MyAnnotationTestFather.class.isAnnotationPresent(MyAnnotation.class));
}
}
Demo5 给自定义注解增加属性
package spring.web.mvc.demo.java.lang.annotation;
import java.lang.annotation.*;
/**
* @Description 自定义java注解
* @author Fan Ruikang
**/
public @interface MyAnnotation {
// 给注解增加属性及默认值
String color() default "blue";//为属性指定缺省值
int[] arrayAttr() default {1,2,4};
RetentionPolicy lamp() default RetentionPolicy.RUNTIME;
}
完整的demo
package spring.web.mvc.demo.java.lang.annotation;
import java.lang.annotation.*;
/**
* @Description 定义注解的生命周期:源代码,class文件,还是二进制字节码。
**/
@Retention(RetentionPolicy.RUNTIME)
/**
* @Description 定义注解的应用场地:注解,构造函数,包,类,属性,方法,参数,本地变量
**/
@Target({ElementType.METHOD,ElementType.TYPE})
/**
* @Description 定义注解继承性,默认不继承
**/
@Inherited
/**
* @Description 自定义java注解
* @author Fan Ruikang
**/
public @interface MyAnnotation {
// 给注解增加属性及默认值
String color() default "blue";//为属性指定缺省值
int[] arrayAttr() default {1,2,4};
RetentionPolicy lamp() default RetentionPolicy.RUNTIME;
}
@SuppressWarning 支持的参数
all : 抑制所有警告
boxing : 抑制装箱、拆箱相关的警告
cast : 抑制强转相关的警告
dep-ann : 抑制过时注解相关的警告
fallthrough : 抑制没有 break 的 switch 语句的警告
finally : 抑制 finally 块没有 return 的警告
hiding : 抑制关于隐藏的本地变量的警告
incomplete-switch : 抑制 switch 语句中 case 不完整的警告(当 case 是枚举时)
nls : 抑制创建无法翻译的字符串的警告 (nls : National Language Support)
null : 抑制关于可能为空的警告
rawtypes : 抑制使用泛型作为类参数时没有指明参数类型的警告
restriction : 抑制使用不建议或者禁止的引用的警告
serial : 抑制一个可序列化类中没有 serialVersionUID 的警告
static-access : 抑制一个不正确的静态访问相关的警告
synthetic-access : 抑制未优化的内部类访问相关的警告
unchecked : 抑制未经检查的操作(比如强转)的警告
unqualified-field-access : 抑制不合格的属性访问的警告
unused : 抑制未使用代码相关的警告
FieldCanBeLocal :抑制全局变量只使用一次,可以被当做局部变量的警告