最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android AOP之注解處理解釋器詳解(二)

 更新時間:2017年03月07日 09:55:27   作者:tpnet  
這篇文章主要介紹了Android AOP之注解處理解釋器詳解(二)的相關(guān)資料,需要的朋友可以參考下

Android APO 注解處理解釋器

相關(guān)文章:

Android AOP注解Annotation詳解(一)
Android AOP之注解處理解釋器詳解(二)
Android AOP 注解詳解及簡單使用實例(三)

一、提取Annotation信息

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

JDK主要提供了兩個類,來完成Annotation的提?。?/p>

  • 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);

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

 }

 @MyTag
 public void testYes(){

 }

 public void testNo(){

 }

}

2.4 結(jié)果

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

......
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 結(jié)果

將會輸出以下內(nèi)容,name和age都可以獲取到。

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

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關(guān)文章

  • Android實現(xiàn)獲取未接來電和未讀短信數(shù)量的方法

    Android實現(xiàn)獲取未接來電和未讀短信數(shù)量的方法

    這篇文章主要介紹了Android實現(xiàn)獲取未接來電和未讀短信數(shù)量的方法,是Android程序開發(fā)中非常常見的重要功能,需要的朋友可以參考下
    2014-08-08
  • Android popupwindow簡單使用方法介紹

    Android popupwindow簡單使用方法介紹

    這篇文章主要為大家詳細介紹了Android popupwindow簡單使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • android實現(xiàn)微信朋友圈發(fā)布動態(tài)功能

    android實現(xiàn)微信朋友圈發(fā)布動態(tài)功能

    這篇文章主要為大家詳細介紹了android實現(xiàn)微信朋友圈發(fā)布動態(tài)功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • Android11繞過反射限制的方法

    Android11繞過反射限制的方法

    這篇文章主要介紹了Android11繞過反射限制的方法,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Android ContentProvider獲取手機聯(lián)系人實例

    Android ContentProvider獲取手機聯(lián)系人實例

    這篇文章主要介紹了Android ContentProvider獲取手機聯(lián)系人實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • Android 4.4以上

    Android 4.4以上"沉浸式"狀態(tài)欄效果的實現(xiàn)方法

    Android與ios效果互仿早已不是什么稀奇的事,我猜大概這個效果來自ios吧,有爭議說這種效果不能叫做沉浸式,叫透明狀態(tài)欄更合適,我也感覺這和沉浸式的含義不太一致。但是大家都這么叫了,那就這樣唄。下面來一起看看關(guān)于Android 4.4以上"沉浸式"效果的實現(xiàn)方法。
    2016-09-09
  • Android中HorizontalScrollView使用方法詳解

    Android中HorizontalScrollView使用方法詳解

    這篇文章主要為大家詳細介紹了Android中HorizontalScrollView使用方法,感興趣的小伙伴們可以參考一下
    2016-05-05
  • Android自定義View實現(xiàn)跟隨手指移動的小兔子

    Android自定義View實現(xiàn)跟隨手指移動的小兔子

    這篇文章主要為大家詳細介紹了Android自定義View實現(xiàn)跟隨手指移動的小兔子,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • Android實現(xiàn)圓形圖片的兩種方式

    Android實現(xiàn)圓形圖片的兩種方式

    這篇文章主要為大家詳細介紹了Android實現(xiàn)圓形圖片的兩種方式,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • Android入門教程之Fragment的具體使用詳解

    Android入門教程之Fragment的具體使用詳解

    Fragment是Android3.0后引入的一個新的API,他出現(xiàn)的初衷是為了適應大屏幕的平板電腦, 當然現(xiàn)在他仍然是平板APP UI設計的寵兒,而且我們普通手機開發(fā)也會加入這個Fragment, 我們可以把他看成一個小型的Activity,又稱Activity片段
    2021-10-10

最新評論

鹿泉市| 新沂市| 德兴市| 沙洋县| 搜索| 阿拉善右旗| 甘谷县| 越西县| 郯城县| 祁连县| 通江县| 抚松县| 隆德县| 大安市| 中山市| 崇礼县| 抚远县| 图片| 新乡市| 丽江市| 汽车| 宁海县| 安吉县| 东兰县| 海门市| 闸北区| 北宁市| 和田市| 崇义县| 民勤县| 松潘县| 天台县| 新河县| 太白县| 临西县| 东丰县| 南汇区| 讷河市| 文水县| 江都市| 石狮市|