一、注解的定义
和定义类的方式相似,自定义注解时用 @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 + "元");
}
}
}