自定义注解
来源:互联网 发布:mac开机出现问号文件夹 编辑:程序博客网 时间:2024/06/07 01:21
Java提供了四种元注解专门用来负责注解其他的注解。
- @Target表示注解可以用于什么地方,可能的ElementType参数包括
- CONSTRUCTOR,构造器的声明
- FIFLD:域声明(包括enum实例)
- LOCAL_VARIABLE:局部变量声明
- PACKAGE:包声明
- PARAMETER:参数声明
- METHOD:方法声明
- TYPE:类,接口(包括注解类型)或enum声明
- @Retention表示需要在什么级别保存该注解信息,可选RetentionPolicy参数包括:
- SOURCE:注解将被编译器丢弃
- CLASS:注解在class文件中可用,但会被VM丢弃
- RUNTIME:VM将在运行期也保留注解,因此可以通过反射机制读取注解信息
- @Documented表示此注解包含在Javadoc中
- @Inherited允许子类继承父类中的注解
下面我们来自定义一个注解,这个注解用来跟踪我们实现某个需求的一组方法,可以帮助我们将用例方法归类整理,便于后期修改维护时查找。
package com.shinerio.annotation;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface SpecialMethod { public String demand(); //描述方法用来实现的需求 public int id(); //方法编号 public String description() default "no description"; //方法描述}
上面的自定义注解中我们使用到了demand,id,description三个注解元素,注解元素的可用类型如下:
- 8种基本数据类型(char,int,short,long,boolean,byte,double,float)
- String
- Class
- enum
- Annotation
- 以上类型的数据
使用非上述类型,编译器会报错,包装类也是不被允许的,我们还发现注解可以作为元素类型,也就是说我们可以通过这个来实现嵌套。
对于元素默认值,Java有严格的限制,元素不能存在不确定的值,即元素必须要么在使用注解时明确提供值,要么元素本身具有默认值,对于非基本类型的元素,null也不能作为其值
下面我们来使用我们自定义的注解来标识一组用于四则运算的方法。
package com.shinerio.annotation;public class Arithmetic { @SpecialMethod(demand="arithmetical",id=1,description="addition") public int add(int...num){ int sum = 0; for (int i = 0; i < num.length; i++) { sum+=num[i]; } return sum; } @SpecialMethod(demand="arithmetical",id=2,description="subtraction") public int sub(int rawNum,int...numForSubracted){ for (int i = 0; i < numForSubracted.length; i++) { rawNum-=numForSubracted[i]; } return rawNum; }}
使用注解的一个好处就是我们可以对注解进行解析,利用java的反射机制很容易帮助我们做到这一点
package com.shinerio.annotation;import java.lang.reflect.Method;public class AnnotationMenthodTracker { public static void main(String[] args) { Class<Arithmetic> c = Arithmetic.class; for(Method m : c.getDeclaredMethods()){ //反射获得类方法 SpecialMethod s = m.getAnnotation(SpecialMethod.class); //获得加载此类上的注解 if(s!=null){ //若存在注解 System.out.println("需求是:"+s.demand()+",编号:"+s.id() +",描述:"+s.description()); } } }}
输出:
需求是:arithmetical,编号:1,描述:addition
需求是:arithmetical,编号:2,描述:subtraction
当你看到这的时候是不是对你为某个需求实现的方法一目了然呢!
0 0
- 自定义注解
- 自定义注解
- 自定义注解
- 自定义注解
- 自定义注解
- 自定义注解
- 自定义注解
- @自定义注解
- 自定义注解
- 自定义注解
- 自定义注解
- 自定义注解
- 自定义注解
- 自定义注解
- 自定义注解
- 自定义注解
- 自定义注解
- 自定义注解
- 随便写写
- hdu 5952Counting Cliques(dfs优化)
- webView.evaluateJavascript 返回null
- 奇异值、奇异矩阵、SVD分解、正交矩阵
- 软件质量模型ISO/IEC--联想记忆法
- 自定义注解
- Dockerfile构建过程
- linux学习笔记之lvm管理
- IOS-各种数据类型的转换
- linux 服务器搭建(一)
- XML解析
- java基础知识
- 《unity shader入门精要》自学笔记(二)
- Android中的ImageLoader实现思路