在《Java注解之基本语法》中我们详细说明了Java中注解的基本语法,也通过一个简单的例子演示了一个简单的注解是怎么定义和使用的。我们知道,在实际的业务开发中,简单的会这点东西是远远不够的。在实际开发中我们定义的注解一般会有实际的逻辑意义,可以在运行时改变程序的执行逻辑,下面就接上上一篇文章讲解在Java中解析注解。这里主要分为两个部分进行讲解:类注解解析、方法注解解析。
1. 类注解解析
类注解解析主要分为以下三步:
第一步:使用类加载器加载类;
第二步:找到类上面的注解;
第三步:获取注解实例。
为了方便在本节浏览,这里将之前章节的代码贴出来,以下是注解的定义和使用:
注解定义代码:
package com.study.annotation.user_defined;
import java.lang.annotation.*;
/**
* <p>Title: Util</p >
* <p>Description: 自定义注解</p >
* <p>Company: http://www.yinjiedu.com</p >
* <p>Project: concurrency</p >
*
* @author: qiwei
* @Date: 2019/10/10 23:30
* @Version: 1.0
*/
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Util {
String desc();
String auth() default "WEIQI";
String dateTime();
}
注解使用代码:
package com.study.annotation.user_defined;
import org.springframework.stereotype.Component;
/**
* <p>Title: CommonParameter</p >
* <p>Description: common parameter</p >
* <p>Company: http://www.yinjiedu.com</p >
* <p>Project: concurrency</p >
*
* @author: qiwei
* @Date: 2019/10/10 23:36
* @Version: 1.0
*/
@Component
@Util(desc = "公共参数定义", dateTime = "2019-10-10")
public class CommonParameter {
public final static String SUCCESS_CODE = "200";
}
注解解析代码
按照上面的步骤,这里对CommonParameter类上面的注解进行解析,代码如下:
package com.study.annotation.parse_annotation;
import com.study.annotation.user_defined.Util;
/**
* <p>Title: ParseAnnotation</p >
* <p>Description: parse annotation</p >
* <p>Company: http://www.yinjiedu.com</p >
* <p>Project: concurrency</p >
*
* @author: qiwei
* @Date: 2019/10/12 23:46
* @Version: 1.0
*/
public class ParseAnnotation {
public static void main(String[] args) {
try {
// 使用类加载器加载类
Class clazz = Class.forName("com.study.annotation.user_defined.CommonParameter");
// 找到类上面的注解
boolean isExistAnno = clazz.isAnnotationPresent(Util.class);
if (isExistAnno) {
// 获取注解实例
Util util = (Util)clazz.getAnnotation(Util.class);
// 打印使用注解输入的信息
System.out.println("annotation desc is : " + util.desc());
System.out.println("annotation auth is : " + util.auth());
System.out.println("annotation dateTime is : " + util.dateTime());
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
输出结果如下:
2. 方法注解解析
解析方法上面的注解和解析类注解差不多类似,只是获取注解的时候需要使用不同的方法,并且使用不同的接受对象去接受,实现代码如下:
注解定义代码:
package com.study.annotation.user_defined;
import java.lang.annotation.*;
/**
* <p>Title: VerifyMobile</p >
* <p>Description: 验证手机号</p >
* <p>Company: http://www.yinjiedu.com</p >
* <p>Project: concurrency</p >
*
* @author: qiwei
* @Date: 2019/10/13 00:12
* @Version: 1.0
*/
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface VerifyMobile {
boolean isRequire() default true;
String mobile();
}
注解使用代码:
package com.study.annotation.user_defined;
/**
* <p>Title: LoginController</p >
* <p>Description: user login</p >
* <p>Company: http://www.yinjiedu.com</p >
* <p>Project: concurrency</p >
*
* @author: qiwei
* @Date: 2019/10/13 00:15
* @Version: 1.0
*/
public class LoginController {
@VerifyMobile(mobile = "137187176XX")
public String login() {
return "enter phone number is true";
}
}
解析注解代码:
package com.study.annotation.parse_annotation;
import com.study.annotation.user_defined.VerifyMobile;
import java.lang.reflect.Method;
/**
* <p>Title: ParseMethodAnnotation</p >
* <p>Description: parse method annotation</p >
* <p>Company: http://www.yinjiedu.com</p >
* <p>Project: concurrency</p >
*
* @author: qiwei
* @Date: 2019/10/13 00:17
* @Version: 1.0
*/
public class ParseMethodAnnotation {
public static void main(String[] args) {
try {
// 使用类加载器加载类
Class clazz = Class.forName("com.study.annotation.user_defined.LoginController");
// 找到方法上面的注解
Method[] methods = clazz.getMethods();
for (Method method : methods) {
// 验证方法上是否存在VerifyMobile注解
boolean isMethodExist = method.isAnnotationPresent(VerifyMobile.class);
if (isMethodExist) {
// 获取注解实例
VerifyMobile verifyMobile = (VerifyMobile)method.getAnnotation(VerifyMobile.class);
// 打印使用注解输入的信息
System.out.println("verifyMobile annotation isRequire is : " + verifyMobile.isRequire());
System.out.println("verifyMobile annotation mobile is : " + verifyMobile.mobile());
}
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
输出结果:
总结:上面是注解的基本解析规则及代码,在实际的工作中灵活使用,可以写出非常简洁的代码,下篇文章我会写一篇注解实战帮助大家理解。