注解
- 定义:Java 注解用于为 Java 代码提供元数据。作为元数据,注解不直接影响你的代码执行,但也有一些类型的注解实际上可以用于这一目的。Java 注解是从 Java5 开始添加到 Java 的。个人理解为标签
- 语法
@Target(ElementType.FIELD)//可以给属性进行注解
@Retention(RetentionPolicy.RUNTIME)//运行时保留的注解,可以通过反射获取到
public @interface Search {
String value() default "";
String[] alternate() default {};
}
public class Student {
@Search(alternate = {"zhanghua","xiaohua"})
private String name;
@Search(value = "10")
private String age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
- @Retention 注解
功能:指明修饰的注解的生存周期,即会保留到哪个阶段。
RetentionPolicy的取值包含以下三种:
SOURCE:源码级别保留,编译后即丢弃。
CLASS:编译级别保留,编译后的class文件中存在,在jvm运行时丢弃,这是默认值。
RUNTIME: 运行级别保留,编译后的class文件中存在,在jvm运行时保留,可以被反射调用。 - @Target 注解
功能:指明了修饰的这个注解的使用范围,即被描述的注解可以用在哪里。
ElementType的取值包含以下几种:
TYPE:类,接口或者枚举
FIELD:域,包含枚举常量
METHOD:方法
PARAMETER:参数
CONSTRUCTOR:构造方法
LOCAL_VARIABLE:局部变量
ANNOTATION_TYPE:注解类型
PACKAGE:包 - @Documented 注解会编译到javadoc中
- @Inherited 父类的注解,子类会得到集成
- @Repeatable 可以重复添加的注解
反射中使用
-
public boolean isAnnotationPresent(Class<? extends Annotation> var1)
判断当前类或者变量是否存在注解字段 -
public T getAnnotation(Class var1)
获得当前类或者变量的注解
示例:
Student student = new Student();
student.setName("李华");
student.setAge("10");
Class studentClass=student.getClass();
Field age = studentClass.getDeclaredField("age");
//判断当前字段是否有存在 "Search"注解
boolean annotationPresent = age.isAnnotationPresent(Search.class);
if (annotationPresent){
Search annotation = age.getAnnotation(Search.class);
String[] alternate = annotation.alternate();
String value = annotation.value();
for (String s:alternate){
System.out.println("alternate="+s);
}
System.out.println("value="+value);
}