您的位置:首页 > 其它

元注解和使用实例

2017-06-02 15:58 127 查看
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小时。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息