一、基本语法:
(1)public @interface 注解名字{};
(2)赋值:
1)String s1() default "hello world";
//可以不赋初始值;
2)String s2 = "hello world";
//1.8jdk以后;
//必须赋初始值;
二、支持的数据类型:
1)String;
2)八大基本数据类型;
3)任何类型的反射;
4)枚举类型;
5)注解类型;
6)以上所有类型的一维数组类型;
//任何类型不能设置为null,可以为"";
三、四大源(元)注解:
(1)@Retention:描述注解的生命周期;
参数:枚举 RetentionPolicy
1)source:源码级别,编译后失效;
2)class:二进制级别,编译有效,运行失效;
3)runtime:运行时界别,该注解在运行时仍然有效;
(2)@Target:描述注解的位置
参数:枚举 ElementType
1)ANNOTATION_TYPE :注释类型声明
2)CONSTRUCTOR:构造方法声明
3)FIELD:字段声明(包括枚举常量)
4)LOCAL_VARIABLE:局部变量声明
5)METHOD:方法声明
6)PACKAGE:包声明
7)PARAMETER:参数声明
8)TYPE:类、接口(包括注释类型)或枚举声明
9)TYPE_PARAMETER:用于标注类型参数;//1.8
10)TYPE_USE:可以标注任何类型名称;//1.8
(3)@Documented:javadoc文档注解;
(4)@Inherited:自动继承注解;
四、反射获取注解的值:
1、注解类:
@Documented @Retention(RetentionPolicy.RUNTIME) @Target(value = {ElementType.FIELD, ElementType.LOCAL_VARIABLE}) public @interface MyAnnotation { String value() default ""; }
2、domain
public class AnnotationTest { @MyAnnotation(value = "hello") public String s; public String getS() { return s; } public void setS(String s) { this.s = s; } @Override public String toString() { return "AnnotationTest{" + "s='" + s + '\'' + '}'; } }
3、反射获取注解的属性值:
public class GetAnnotationToField { public static void main(String[] args) throws Exception{ //创建反射对象; Class<?> cls = AnnotationTest.class; //获取所有属性的反射对象; Field[] fields = cls.getDeclaredFields(); //根据反射对象创建实例; Object newInstance = cls.newInstance(); for (int i = 0; i < fields.length; i++) { Field field = fields[i]; //允许操作私有属性 field.setAccessible(true); //根据注释名获取注释对象; MyAnnotation annotation = field.getAnnotation(MyAnnotation.class); //判断是否成功获取注释对象,如果不存在返回null; if (annotation != null) { //.注释属性名,获取注释中值; String value = annotation.value(); //获取属性反射对象的属性类型; Class<?> typeCls = field.getType(); //如果属性类型等于String的反射对象,直接赋值; if (typeCls == String.class) { field.set(newInstance, value); } else { //获取其它未知包装类的字符串构造方法,用于传入字符串构建包装类; Constructor<?> constructor = typeCls.getConstructor(String.class); //执行构造,创建包装类; Object fieldObj = constructor.newInstance(value); //设置参数; field.set(newInstance, fieldObj); } } } System.out.println(newInstance); } }