元注解和使用实例

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个小时,控制台的情况为:
元注解和使用实例_第1张图片
如果我们设置为6个小时,控制台的情况为:工作时间设置成功,为9小时。

你可能感兴趣的:(Javaweb)