注解机制简单的说就是给程序的元素(类、方法、属性)加上一个标记,然后在运行的时候通过反射机制获取该元素的标记,然后执行对应的逻辑,注解就相当于标记。
内建注解
Java中主要有以下三个默认注解:
1.Override 表示该方法将覆盖父类中方法
2.Deprecated 表示使用了废弃的不赞成使用的方法
3.SuppressWarning 表示抑制了程序的告警
元注解
元注解表示专门负责创建注解的注解
1.Document 说明该注解将被包含在javadoc中
2.Inherited 说明允许子类继承父类中的注解
3.Retention 注解的存活时间。SOURCE:存在源代码,注解将被编译器丢弃;CLASS:注解在编译后的class文件中可用,但会被VM丢弃;RUNTIME:VM将在运行期间保留注解,因此可以通过反射机制读取注解的信息
4.Target 表示该注解可以用于什么地方,注解类型所适用的程序元素的种类。CONSTRUCTOR:构造器的声明;FIELD:域声明;LOCAL_VARIABLE:局部变量声明;METHOD:方法声明;PACKAGE:包声明;PARAMETER:参数声明;TYPE:类、接口(包括注解类型)或enum声明
自定义注解
定义一个注解StrRule,用于修饰对象字符串类型的属性。注解包含两个属性,range用于设置字符串的长度范围,name用于设置修饰的字符串的名称。
package com.victor.technology.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface StrRule
{
public String range();
public String name();
}
定义一个对象Student,并在name属性使用StrRule注解:
package com.victor.technology.annotation;
public class Student
{
@StrRule(range = "1-32", name = "Student Name")
private String name;
private int number;
public Student(String name, int number)
{
this.name = name;
this.number = number;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public int getNumber()
{
return number;
}
public void setNumber(int number)
{
this.number = number;
}
}
定义一个测试类,通过反射机制获取对象属性的注解,并获取设置的注解的值,然后执行对应的业务逻辑(可以是数据校验,此处没有扩展实现)
package com.victor.technology.annotation;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
public class AnnotationTest
{
public static void main(String[] args)
{
Student stu = new Student("victor", 1);
Field[] fields = stu.getClass().getDeclaredFields();
for(Field field : fields)
{
Annotation[] annotations = field.getAnnotations();
for(Annotation annotation : annotations)
{
String annotationName = annotation.annotationType().getSimpleName();
if(annotationName.equals("StrRule"))
{
StrRule rule = (StrRule) annotation;
String range = rule.range();
String name = rule.name();
System.out.println("Range: " + range + ", name: " + name);
}
}
}
}
}
执行结果如下:
Range: 1-32, name: Student Name