JDK 5 Annotation\注解\注释\自定义注解

编程技术  /  houtizong 发布于 3年前   114

作者:赵磊

博客:http://elf8848.iteye.com

 

自定义注解示例

---------------------------------------------

@Transactional  注解示例

 

package org.springframework.transaction.annotation;import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.annotation.Inherited;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;import org.springframework.transaction.TransactionDefinition;@Target({ElementType.METHOD, ElementType.TYPE})//可以作用在类上和方法上@Retention(RetentionPolicy.RUNTIME)//可以通过反射读取注解@Inherited//可以被子类继承@Documented//javadoc生成文件档时,包含本注解信息public @interface Transactional {String value() default "";//使用时没有指定key,值默认赋给value,如:Transactional("abc")Propagation propagation() default Propagation.REQUIRED;Isolation isolation() default Isolation.DEFAULT;int timeout() default TransactionDefinition.TIMEOUT_DEFAULT;boolean readOnly() default false;Class<? extends Throwable>[] rollbackFor() default {};String[] rollbackForClassName() default {};Class<? extends Throwable>[] noRollbackFor() default {};String[] noRollbackForClassName() default {};}
 

 

 

J2SE5.0为注解单独提供了4种注解

---------------------------------------------

它们是Target、Retention、Documented和Inherited。

可以在自定义注解时使用这4个注解。

 

@Inherited

---------------------------------------------

继承是java主要的特性之一。在类中的protected和public成员都将会被子类继承,但是父类的注解会不会被子类继承呢?

很遗憾的告诉大家,在默认的情况下,父类的注解并不会被子类继承。如果要让这个注解可以被继承,就必须在定义注解时在源码上加上@Inherited注解。 

 

自大定义一个MyAnnotation注解@Inherited@interface MyAnnotation { }使用MyAnnotation注解@MyAnnotationpublic class ParentClass {}子类继承父类public class ChildClass extends ParentClass { }

 

在以上代码中ChildClass和ParentClass一样都已被MyAnnotation注解了。 

 

@Retention 

---------------------------------------------

成功通过反射读取类上或方法上的注解,是有前提的--要使用@Retention,就是设置注解是否保存在class文件中。

下面的代码是Retention的详细用法。 

 

@Retention(RetentionPolicy.SOURCE)@interface MyAnnotation1 { }//作用是不将注解保存在class文件中,也就是说象“//”一样在编译时被过滤掉了。@Retention(RetentionPolicy.CLASS)@interface MyAnnotation2 {}//作用是只将注解保存在class文件中,而使用反射读取注解时忽略这些注解。@Retention(RetentionPolicy.RUNTIME)@interface MyAnnotation3 {}//作用是即将注解保存在class文件中,也可以通过反射读取注解。这也是最常用的值 
 

 

 

@Target

---------------------------------------------

标识自定义注解 可以作用于 类上、方法上、成员变量上、构造方法、其它...

 

@Documented 

---------------------------------------------

在默认的情况下在使用javadoc自动生成文档时,注解将被忽略掉。如果想在文档中也包含注解,必须使用Documented为文档注解。 

 

如何读取注解--类上的注解

---------------------------------------------

 

//取得类上的指定的注解Annotation annotation = 类.class.getAnnotation(MyAnnotation.class);//取得类上的所有注解,包括继承的注解。Annotation[] annotations = 类.class.getAnnotations();//取当前类上的所有的注解,不包括继承的Annotation[] annotations = 类.class.getDeclaredAnnotations();
 

 

如何读取注解--方法上的注解

---------------------------------------------

 

//取得方法上的指定的注解Method m=?Annotation annotation = m.getAnnotation(MyAnnotation.class);//取得方法上的所有注解,包括继承的注解。Annotation[] annotations = m.getAnnotations();//取当前方法上的所有的注解,不包括继承的Annotation[] annotations = m.getDeclaredAnnotations();
  

注:要想使用反射得到注解信息,这个注解在定义时源码中必须使用

@Retention(RetentionPolicy.RUNTIME)进行注解。

 

 

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!

留言需要登陆哦

技术博客集 - 网站简介:
前后端技术:
后端基于Hyperf2.1框架开发,前端使用Bootstrap可视化布局系统生成

网站主要作用:
1.编程技术分享及讨论交流,内置聊天系统;
2.测试交流框架问题,比如:Hyperf、Laravel、TP、beego;
3.本站数据是基于大数据采集等爬虫技术为基础助力分享知识,如有侵权请发邮件到站长邮箱,站长会尽快处理;
4.站长邮箱:[email protected];

      订阅博客周刊 去订阅

文章归档

文章标签

友情链接

Auther ·HouTiZong
侯体宗的博客
© 2020 zongscan.com
版权所有ICP证 : 粤ICP备20027696号
PHP交流群 也可以扫右边的二维码
侯体宗的博客