学习java的时候总是看见这些注解:@Override,@SuppressWarnings(“unused”)等,平时只知道怎么用,但是不知道如何实现的,今天学习了下,将自己的学习结果分享下,以下以一个小的例子来说明下如何定义自己的注解
1.要实现自定义注解需要通过@interface的方式进行定义,定义注解的语法:
public @interface AnnoName{ 修饰符 数据类型 变量名称();}
这里变量名后面必须用();变量的修饰符可以省略,以下是自己定义的一个注解:
/**
* @ClassName: Logininfo
* @Description:自定义注解Logininfo
* @Author:
* @Date: 2019/6/3
*/
@Documented
@Retention(RetentionPolicy.RUNTIME) //定义注解的生效范围
@Target(value= ElementType.METHOD) //表明此注解针对方法有效
public @interface Logininfo { //定义自己的注解名字为:Logininfo
String name() default "";
String password() default "";
}
以上自定义的注解还用到了其他三个注解,这里介绍下其作用:
1.@Retention(RetentionPolicy.RUNTIME):
这个注解的作用主要是说明自定义注解的生效范围,它主要有三个值:
(1)SOURCE:此注解的信息只会保存在源文件中,编译时会被编译器丢弃
(2)CLASS:编译器会将注释记录在类文件中,但是不会被加载到JVM,如果一个注解声明时没有指定范围,默认的就是CLASS
(3)RUNTIME:此注解类型的信息会被保存到源文件,类文件中,同时执行的时候也会被加载到JVM中,此注解可以用利用反射读取其内容
2.@Target(value= ElementType.METHOD):
此注解声明自定义的注解使用的范围,使用在类上,方法上还是参数上,这个注解中存在一个ElementType[]类型的变量,可以用于指定自定义注解的使用限制,它主要有以下几个值:
(1)ANNOTATION_TYPE:只能用在注释的声明上;
(2)CONSIRUCTOR:只能用在构造方法的声明上;
(3)FOELD:只能用在字段的声明上,包含枚举变量;
(4)LOCAL_VARIABLE:只能用在局部变量的声明上;
(5)METHOD:只能用在方法的声明上;
(6)PACKAGE:只能用在包的声明上;
(7)PARAMEIER:只能用在参数的声明上;
(8)TYPE:只能用在类、接口、枚举类型上
3.@Documented
它可以将自定义的注解设置为文档说明信息,因此生成javadoc文档的时候会将此注解的信息加入到文档中。
除了以上三个还有一个注解:
4.@Inherited
此注解用于标注一个父类的注解是否可以被子类继承,如果一个注解需要被子类所继承,在声明的时候直接加上@Inherited即可
下面以一个小例子测试下刚才自定义注解@Logininfo的用法:
定义一个CheckLogin类,其中定义一个判断用户名和密码的方法login(),通过自定义的注解设置默认值
/**
* @ClassName: CheckLogin
* @Description: 自定义注解的运用
* @Author:
* @Date: 2019/6/4
*/
public class CheckLogin {
/*
* @Author
* @Description 通过方法运用刚才自定义的注解,通过接收参数判断用户输入的用户名和密码和给定
的用户名和密码是否一致
* @Date 2019/6/4
* @Param [name, password]
* @return boolean
**/
@Logininfo(name="add",password="123") //设置默认的用户名和密码
public boolean login(String name,String password) throws Exception {
//获取注解中参数的内容
// 1.获取方法
Method method = CheckLogin.class.getMethod("login", String.class, String.class);
// 2.获取方法中的注解对象
Logininfo logininfo = method.getAnnotation(Logininfo.class);
// 3.获取注解中的参数值
String uname = logininfo.name();
String upwd = logininfo.password();
// 4.比较二者的值
if(name.equals(uname) && password.equals(upwd)){
//如果二者相等,返回true
return true;
}
// 否则返回false
return false;
}
}
对login()方法进行测试:
/**
* @ClassName: LoginMain
* @Description:测试自定义注解
* @Author:
* @Date: 2019/6/4
*/
public class LoginMain {
public static void main(String[] args) throws Exception {
CheckLogin cl = new CheckLogin();
//控制台输入用户名,密码
Scanner sc = new Scanner(System.in);
System.out.println("请输入用户名:");
String uname = sc.next();
System.out.println("请输入密码:");
String upwd = sc.next();
//调用login方法
boolean b = cl.login(uname, upwd);
if(b){
System.out.println("密码验证成功!");
}else{
System.out.println("密码验证失败!");
}
}
}
以下是测试结果:
1.用户名和密码不一致的情况:
请输入用户名:
123
请输入密码:
132
密码验证失败!
2.用户名和密码相同的情况:
请输入用户名:
add
请输入密码:
123
密码验证成功!
以上是个人对于自定义注解的学习分享,有问题欢迎大家提出。