中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

Android AOP中注解處理解釋器的作用有哪些

發布時間:2020-11-26 16:30:57 來源:億速云 閱讀:139 作者:Leah 欄目:移動開發

本篇文章給大家分享的是有關Android AOP中注解處理解釋器的作用有哪些,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

一、提取Annotation信息

當開發者使用了Annotation修飾了類、方法、Field等成員之后,這些Annotation不會自己生效,必須由開發者提供相應的代碼來提取并處理Annotation信息。這些處理提取和處理Annotation的代碼統稱為APT(Annotation Processing Tool)。

JDK主要提供了兩個類,來完成Annotation的提取:

  • Java.lang.annotation.Annotation接口:這個接口是所有Annotation類型的父接口。

  • java.lang.reflect.AnnotatedElement接口:該接口代表程序中可以被注解的程序元素。

1.1 Annotation接口

這個接口比較少用,這個接口里面有四個方法:

package java.lang.annotation;

public interface Annotation {

 boolean equals(Object obj);

 int hashCode();

 String toString();

 //返回該注解的Class,元素使用了多個注解的時候,可以進行輸出判斷
 Class<? extends Annotation> annotationType();
}

1.2 AnnotatedElement接口

該接口最常用的方法是isAnnotationPresent()、getAnnotation(Class annotationClass):

package java.lang.reflect;

import java.lang.annotation.Annotation;

public interface AnnotatedElement {

 //判斷此元素上是否存在指定類型的注解,如果存在則返回true,否則返回false
 default boolean isAnnotationPresent(Class<? extends Annotation> annotationClass) {
   return getAnnotation(annotationClass) != null;
 }

 //返回此元素上存在的指定類型的注解,如果該類型的注解不存在,則返回null
 <T extends Annotation> T getAnnotation(Class<T> annotationClass);

 //返回此元素上存在的所有注解。
 Annotation[] getAnnotations();

 //返回此元素上存在的所有注解。不包括繼承
 Annotation[] getDeclaredAnnotations();

 default <T extends Annotation> Annotation getDeclaredAnnotation(Class<T> annotationClass) {
  return AnnotatedElements.getDeclaredAnnotation(this, annotationClass);
 }

 default <T extends Annotation> T[] getDeclaredAnnotationsByType(Class<T> annotationClass) {
  return AnnotatedElements.getDeclaredAnnotationsByType(this, annotationClass);
 }

 default <T extends Annotation> T[] getAnnotationsByType(Class<T> annotationClass) {
  return AnnotatedElements.getAnnotationsByType(this, annotationClass);
 }

}

二、栗子One

簡單獲取方法

2.1 定義注解MyTag

@Target(ElementType.METHOD) //修飾方法
@Retention(RetentionPolicy.RUNTIME) //運行時可以獲取
public @interface MyTag {

}

2.2 定義解析器

public class MyTagParser {

 public static void process(Object clazz) {

  try {
   for (Method method : clazz.getClass().getMethods()) {
    if (method.isAnnotationPresent(MyTag.class)) {
     //獲取到了,輸出
     Log.e("tag","被mytag注解修飾的方法:" + method.getName());
    } else {
     Log.e("tag","沒有被mytag注解修飾的方法:" + method.getName());
    }
   }
  } catch (Exception en) {
   en.printStackTrace();
  }
 }

}

2.3 啟動Activity

public class MainActivity extends Activity{

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  //調用解析器
  MyTagParser.process(this);

 }

 @MyTag
 public void testYes(){

 }

 public void testNo(){

 }

}

2.4 結果

運行就會看到輸出,表示已經獲取到了對應的實例

......
02-18 15:23:41.622 12446-12446/? E/tag: 沒有被mytag注解修飾的方法:stopServiceAsUser
02-18 15:23:41.622 12446-12446/? E/tag: 沒有被mytag注解修飾的方法:takeKeyEvents
02-18 15:23:41.622 12446-12446/? E/tag: 沒有被mytag注解修飾的方法:testNo
02-18 15:23:41.622 12446-12446/? E/tag: 被mytag注解修飾的方法:testYes
02-18 15:23:41.632 12446-12446/? E/tag: 沒有被mytag注解修飾的方法:toString
02-18 15:23:41.632 12446-12446/? E/tag: 沒有被mytag注解修飾的方法:triggerSearch
02-18 15:23:41.632 12446-12446/? E/tag: 沒有被mytag注解修飾的方法:unbindService
.......

三、栗子Two

取到方法里面的值

3.1 定義注解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyTag {
 String name() default "天平";
 int age();
}

3.2 定義解析器

public class MyTagParser {

 public static void parser(Object o){
  Class clazz = o.getClass();

  for(Method method:clazz.getMethods()){
   if(method.isAnnotationPresent(MyTag.class)){
    MyTag myTag = method.getAnnotation(MyTag.class);
    Log.e("tag","方法名:"+method.getName()+"的注解值為"+myTag.name()+","+myTag.age());
   }
  }

 }

}

3.3 定義activity

public class MainActivity extends Activity{

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  MyTagParser.parser(this);


 }

 @MyTag(age = 20)
 public void testYes(){

 }



}

3.3 結果

將會輸出以下內容,name和age都可以獲取到。

02-18 16:11:53.493 25662-25662/? E/tag: 方法名:testYes的注解值為天平,20

以上就是Android AOP中注解處理解釋器的作用有哪些,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

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

AI

内丘县| 金乡县| 贵溪市| 射洪县| 延寿县| 苏州市| 乌兰察布市| 南投市| 礼泉县| 苗栗县| 揭阳市| 乐昌市| 芜湖县| 香河县| 商南县| 临清市| 突泉县| 西充县| 苏尼特左旗| 盈江县| 宿州市| 新巴尔虎左旗| 阿勒泰市| 香格里拉县| 平安县| 金坛市| 土默特左旗| 乌拉特中旗| 巫溪县| 龙山县| 香格里拉县| 潍坊市| 呼玛县| 永安市| 新密市| 兴安县| 凯里市| 隆德县| 宜章县| 大埔县| 赣榆县|