自定义注解

一、注解的定义

和定义类的方式相似,自定义注解时用 @interface 名称,以下为具体的实现方法。 该里定义了一个关于银行最大转账金额的注解

package cn.csdn.annotation.demo1;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface BankInfo {

    int maxMoney();
}

在这里我们用到了元注解,以下就是对元注解的简单介绍

元注解:修饰注解的注解

1.@Retention
作用:是指定注解给谁使用.

        它的属性值只能是以下三个
          RetentionPolicy.SOURCE  给编译器使用  使用后抛弃
          RetentionPolicy.CLASS   给解析器使用,当jvm加载完成后,就抛弃.                     
          RetentionPolicy.RUNTIME   jvm加载完成后,还存在。开发人员可以通过反射来获取注解相关信息.                                   
2.@Target
                作用:就是定义注解在什么位置使用
3.@Documented
                作用:是通过javadoc生成的文档中是否抽取注解描述.
4.@Inherited
                作用:是描述当前注解是否具有继承性,其子类是否能使用

二、注解的成员介绍

注解成员:
1.可以有属性
注解中可以有属性,但是基本不使用。
2.可以有方法

在开如,一般使用注解时,只研究它的方法,我们一般管它叫做注解中的属性.

1.关于注解中的属性的类型问题.
    它的类型只能是以下几种:
        1.基本类型
            整型:byte short int long
            浮点:float double
            字符:char
            逻辑:boolean
        2.String
        3.Class
        4.enum
        5.Annotation
        6.以上类型的一维数组。

2.关于注解中有属性,使用的问题
    如果一个注解中有属性,并且属性没有默认值,那么我们在使用注解时,必须给注解的属性赋值.

    关于属性赋值方式:

        1.默认值问题
            String st() default "abc";

        2.如果是单值

            注解(属性名称=值)
            例如:@MyAnnotation3(i=1)
        3.如果是数组
            1.如果只赋一个值
                注解(属性名称=值)
                例如:@MyAnnotation3(i=1)
            2.如果要赋多个值
                注解(属性名称={值1,值2,...})
                例如:@MyAnnotation3(i={1,2,3})

        4.关于属性名称value问题
            可以省略属性名称
                例如 @MyAnnotation3("hello");

            如果value属性是一个数组:
                @MyAnnotation3({"a","b"})

            如果注解中有value属性,还有其它属性:
                那么value属性名称不能在省略.

三、注解的使用

利用注解使最大的转账金额限制在100000元

package cn.itcast.annotation.demo1;

import java.lang.reflect.Method;

//银行最大转账金额100000
public class Bank {

    @BankInfo(maxMoney = 100000)
    public void account(String name1, String name2, int money)throws NoSuchMethodException, SecurityException {

        // 1.1 获取当前类的Class对象
        Class clazz = this.getClass();

        // 1.2 获取当前方法的Method对象.
        Method method = clazz.getDeclaredMethod("account", String.class,
                String.class, int.class);

        boolean flag =method.isAnnotationPresent(BankInfo.class); // 判断当前方法上是否有BankInfo这个注解.
        if (flag) {
            // 2.在Method类中有一个 getAnnotation(Class annotationClass),可以获取一个注解对象.
            BankInfo bif = method.getAnnotation(BankInfo.class);

            // 3.通过注解对象来调用其属性.
            int maxMoney = bif.maxMoney();

            if (money > maxMoney) {
                throw new RuntimeException("最大转账金额为:" + maxMoney + "元");
            }

            System.out.println(name1 + "向" + name2 + "转账:" + money + "元");
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值