自定义注解

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

当你看到这的时候是不是对你为某个需求实现的方法一目了然呢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值