Java註解之解析註解

在《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();
        }
    }
}

輸出結果:

總結:上面是註解的基本解析規則及代碼,在實際的工作中靈活使用,可以寫出非常簡潔的代碼,下篇文章我會寫一篇註解實戰幫助大家理解。

 想要了解實時博文,可以關注公衆號《編程之藝術》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章