一、基本语法:
(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 @interfaceMyAnnotation {
String value()default "";
}
2、domain
public classAnnotationTest {
@MyAnnotation(value= "hello")publicString s;publicString getS() {returns;
}public voidsetS(String s) {this.s =s;
}
@OverridepublicString toString() {return "AnnotationTest{" +
"s='" + s + '\'' +
'}';
}
}
3、反射获取注解的属性值:
public classGetAnnotationToField {public static void main(String[] args) throwsException{//创建反射对象;
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);
}
}