元注解和使用实例
程序员文章站
2022-05-23 18:14:00
...
1. 元注解是什么
元注解也是注解,不过它的用途稍微有点不同,它是用来注解(动词)注解(名词)的注解(名词)。其中注解@Retention和@Inherited两个注解很经常使用。
2. 元注解之:@Retention
@Retention:只能用于修饰一个Annotation定义,用于指定该Annotation可以保留的域,通过赋一个RetentionPolicy类型的值,指定可以保留的域。再通俗点将就是这个注解的作用是指定给谁用的。
参数值 | 赋值后的作用 |
---|---|
RetentionPolicy.CLASS | (默认值)给解析器使用的。编译器会把注解记录在class文件中,当运行java程序的时候,JVM不会保留注解。 |
RetentionPolicy.RUNTIME | 编译器会在注解记录在class文件中,当运行java程序时,JVM会保留注解,程序可以通过反射来获取该注解。 |
RetentionPolicy.SOURCE | 给编译器使用的。编译器不会将注解记录到class文件中。 |
3. 元注解之@Target
@Target注解的作用是用于修饰类的哪个成员。它包含了一个名为value,类型为ElementType的成员变量。用于指定修饰目标对象的类型:TYPE(类、接口)、FIELD(成员变量)、METHOD(方法)。
4. 元注解之@Documented
用于指定被@Documented修饰的 Annotation 类将被 javadoc 工具提取成文档。使用该元注解修饰,该注解的信息可以生成到javadoc 文档中。
5. 元注解之@Inherited
如果一个注解使用该元注解修饰,那么某个类使用了这个注解,其子类也会自动继承这个注解。
6. 自定义注解实例
下面的一个实例是设置工作时间上限的,一般我们也能通过配置文件来进行设置,但是我们今天要用注解的方式来完成。
首先我们设置一个自定义注解:
@Retention(RetentionPolicy.RUNTIME) //JVM会保留这个注解。
@Target(ElementType.METHOD) //这个元注解是说明这个注解的目标是用于方法的。
public @interface StandardTime{
//int型注解属性,上限工作时间。
int ceilingTime();
}
目标程序(放在自定义的Work类中)使用这个注解:
@StandardTime(ceilingTime=8) //使用我们自定义的注解
public void setWorkTime(int time)throws SecurityException, NoSuchMethodException{
//1.第一步获取当前method对象。
//1.1获取当前类的class对象。
Class clazz = this.getClass();
//1.2获取当前方法的method对象。
Method method = clazz.getDeclaredMethod("setWorkTime",int.class);
//1.3判断当前方法是否有ceilingTime这个注解?
if(method.isAnnotationPresent(StandardTime.class)){
//2.在Method类中有一个getAnnotation(Class annotationClass),可以获取一个注解对象。
//3.通过注解对象来获取注解的属性。
StandardTime standard = method.getAnnotation(StandardTime.class);
int ceilingTime = standard.ceilingTime();
if(time>ceilingTime)
throw new RuntimeException("最大的工作时间为"+ceilingTime+"小时。");
System.out.println("工作时间设置成功,为"+time+"小时。");
}
}
我们来测试一下是否可行:
public class WorkTimeTest {
public static void main(String[] args) throws SecurityException, NoSuchMethodException {
Work work = new Work();
work.setWorkTime(9);
}
}
测试结果:
如果我们设置为6个小时,控制台的情况为:工作时间设置成功,为6小时。
如果我们设置为9个小时,控制台的情况为:
如果我们设置为6个小时,控制台的情况为:工作时间设置成功,为9小时。