自定义注解

来源:互联网 发布: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
原创粉丝点击