元注解和使用实例
2017-06-02 15:58
127 查看
1. 元注解是什么
元注解也是注解,不过它的用途稍微有点不同,它是用来注解(动词)注解(名词)的注解(名词)。其中注解@Retention和@Inherited两个注解很经常使用。
2. 元注解之:@Retention
@Retention:只能用于修饰一个Annotation定义,用于指定该Annotation可以保留的域,通过赋一个RetentionPolicy类型的值,指定可以保留的域。再通俗点将就是这个注解的作用是指定给谁用的。
3. 元注解之@Target
@Target注解的作用是用于修饰类的哪个成员。它包含了一个名为value,类型为ElementType的成员变量。用于指定修饰目标对象的类型:TYPE(类、接口)、FIELD(成员变量)、METHOD(方法)。
4. 元注解之@Documented
用于指定被@Documented修饰的 Annotation 类将被 javadoc 工具提取成文档。使用该元注解修饰,该注解的信息可以生成到javadoc 文档中。
5. 元注解之@Inherited
如果一个注解使用该元注解修饰,那么某个类使用了这个注解,其子类也会自动继承这个注解。
6. 自定义注解实例
下面的一个实例是设置工作时间上限的,一般我们也能通过配置文件来进行设置,但是我们今天要用注解的方式来完成。
首先我们设置一个自定义注解:
目标程序(放在自定义的Work类中)使用这个注解:
我们来测试一下是否可行:
测试结果:
如果我们设置为6个小时,控制台的情况为:工作时间设置成功,为6小时。
如果我们设置为9个小时,控制台的情况为:
如果我们设置为6个小时,控制台的情况为:工作时间设置成功,为9小时。
元注解也是注解,不过它的用途稍微有点不同,它是用来注解(动词)注解(名词)的注解(名词)。其中注解@Retention和@Inherited两个注解很经常使用。
2. 元注解之:@Retention
@Retention:只能用于修饰一个Annotation定义,用于指定该Annotation可以保留的域,通过赋一个RetentionPolicy类型的值,指定可以保留的域。再通俗点将就是这个注解的作用是指定给谁用的。
参数值 | 赋值后的作用 |
---|---|
RetentionPolicy.CLASS | (默认值)给解析器使用的。编译器会把注解记录在class文件中,当运行java程序的时候,JVM不会保留注解。 |
RetentionPolicy.RUNTIME | 编译器会在注解记录在class文件中,当运行java程序时,JVM会保留注解,程序可以通过反射来获取该注解。 |
RetentionPolicy.SOURCE | 给编译器使用的。编译器不会将注解记录到class文件中。 |
@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小时。
相关文章推荐
- DWR高级主题之DWR与spring集成(不使用springMVC,不使用注解的实例)
- java中注解的使用与实例(一)
- spring + ehcache 注解使用实例
- java中注解的使用与实例
- java中注解的使用与实例 (二)
- DWR高级主题之DWR与spring集成(使用springMVC,非注解的实例)
- Spring+SpringMVC+mybatis+easyui整合实例(二)注解方式的mybatis的使用
- 使用自定义注解实例2
- java中注解的使用与实例
- java中注解的使用与实例(一)
- java中注解的使用与实例 (二)
- Java 注解的使用与实例(一)
- DWR3与spring集成(不使用springMVC,但使用注解的实例)
- [转] java中注解的使用与实例
- 微信企业号简单的OAuth2验证接口实例(使用SpringMVC非注解方式)
- DWR高级主题之DWR与spring集成(不使用springMVC,但使用注解的实例)
- 打开注解是对的,关闭是错的使用ThreadLocal实例
- java中注解的使用与实例 (二)
- java注解Annotation的使用实例
- java中注解的使用与实例 (二)