在《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();
}
}
}
輸出結果:
總結:上面是註解的基本解析規則及代碼,在實際的工作中靈活使用,可以寫出非常簡潔的代碼,下篇文章我會寫一篇註解實戰幫助大家理解。
想要了解實時博文,可以關注公衆號《編程之藝術》