91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么利用反射取得Annotation信息

發布時間:2021-06-22 17:14:03 來源:億速云 閱讀:116 作者:Leah 欄目:編程語言

本篇文章為大家展示了怎么利用反射取得Annotation信息,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

獲取Annotation信息

在進行類或方法定義時,都可以使用一系列的Annotation進行聲明,于是如果要想獲得這些Annotation信息,那么可以直接通過反射來完成。在java.lang.reflect里面有一個AccessibleObject類,在本類中提供有獲取Annotation類的方法:

獲取全部Annotation:
public Annotation[] getAnnotations()
獲取指定Annotation:
public <T extends Annotation> T getAnnotation(Class<T> annotationClass)

怎么利用反射取得Annotation信息

范例:定義一個接口,并在接口在使用Annotation

import java.io.Serializable;import java.lang.annotation.Annotation;import java.lang.reflect.Method;public class JavaAPIDemo {public static void main(String[] args) throws Exception {
        {   //獲取接口上的Annotation信息Annotation annotations [] = IMessage.class.getAnnotations();  //獲取接口上的全部Annotationfor (Annotation temp : annotations) {
                System.out.println(temp);//@java.lang.FunctionalInterface()//@java.lang.Deprecated(forRemoval=false, since="1.0")}
        }
        System.out.println("-----------------------");
        {//獲取MessageImpl子類上的Annotation信息Annotation annotations []= MessageImpl.class.getAnnotations();  //獲取類上的全部Annotationfor (Annotation temp : annotations) {
                System.out.println(temp);
            }
        }
        System.out.println("-----------------------");
        {   //獲取MessageImpl.toString()方法上的Annotation信息Method method = MessageImpl.class.getDeclaredMethod("send", String.class);Annotation annotations [] = method.getAnnotations();  for (Annotation temp : annotations) {
                System.out.println(temp);
            }
        }
    }
}@FunctionalInterface    //程序執行時可以獲取@Deprecated(since = "1.0")     interface IMessage {     //有2個Annotationpublic void send(String msg);
}@SuppressWarnings("serial")     //無法在程序執行時獲取class MessageImpl implements IMessage, Serializable {@Override      //無法在程序執行時獲取public void send(String msg) {
        System.out.println("【消息發送】" + msg);
    }
}

不同的Annotation有它的存在范圍,下面對比兩個Annotation:
@FunctionalInterface(運行時):

@Documented@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.TYPE)
public @interface FunctionalInterface {}

@SuppressWarnings(源代碼):

@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE, MODULE})@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {}

現在發現“@FunctionalInterface”是在運行時生效的Annotation,所以程序執行時可以獲取Annotation;而“@SuppressWarnings”是在源代碼編寫時有效。
在RetentionPolicy枚舉類中還有一個class的定義,指的是在類定義時生效。

自定義Annotation

現在已經清楚了Annotation的獲取,以及Annotation的運行策略,但是最為關鍵性的因素是如何實現自定義的Annotation呢?為此在Java中提供了新的語法,使用“@interface”來定義Annotation。
范例:自定義Annotation

import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.reflect.Method;@Retention(RetentionPolicy.RUNTIME)   //定義Annotation的運行策略@interface DefaultAnnotation {      //自定義的Annotationpublic String title();      //獲取數據public String url() default "www.mldn.cn";   //獲取數據class Message {@DefaultAnnotation(title = "MLDN")public void send(String msg) {
        System.out.println("【消息發送】" + msg);
    }
}public class JavaAPIDemo {public static void main(String[] args) throws Exception {
        Method method = Message.class.getMethod("send",String.class);  //獲取指定方法DefaultAnnotation  anno = method.getAnnotation(DefaultAnnotation.class);  //獲取指定的Annotation//System.out.println(anno.title());  //直接調用Annotation中的方法  MLDN//System.out.println(anno.url());    //直接調用Annotation中的方法  www.mldn.cn//直接調用Annotation中的方法String msg = anno.title()+"("+anno.url()+")";  //消息內容 method.invoke(Message.class.getDeclaredConstructor().newInstance(), msg);   //【消息發送】MLDN(www.mldn.cn)}
}

使用Annotation之后的最大特點是可以結合反射機制實現程序的處理。

上述內容就是怎么利用反射取得Annotation信息,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

阿拉尔市| 博兴县| 炎陵县| 和顺县| 淮滨县| 大埔区| 太仓市| 卓资县| 德清县| 东宁县| 江口县| 昌乐县| 东平县| 屏南县| 新津县| 黎城县| 张家界市| 崇阳县| 赤峰市| 郸城县| 安岳县| 平罗县| 巴林右旗| 喀喇沁旗| 盘山县| 杭锦后旗| 曲周县| 台南县| 普兰县| 六枝特区| 应用必备| 西青区| 双峰县| 高州市| 兴山县| 莒南县| 邹城市| 郑州市| 五家渠市| 团风县| 丰城市|