本篇文章給大家分享的是有關(guān)Android AOP中注解處理解釋器的作用有哪些,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。
創(chuàng)新互聯(lián)主營(yíng)百色網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,app軟件開(kāi)發(fā),百色h5成都微信小程序搭建,百色網(wǎng)站營(yíng)銷推廣歡迎百色等地區(qū)企業(yè)咨詢
一、提取Annotation信息
當(dāng)開(kāi)發(fā)者使用了Annotation修飾了類、方法、Field等成員之后,這些Annotation不會(huì)自己生效,必須由開(kāi)發(fā)者提供相應(yīng)的代碼來(lái)提取并處理Annotation信息。這些處理提取和處理Annotation的代碼統(tǒng)稱為APT(Annotation Processing Tool)。
JDK主要提供了兩個(gè)類,來(lái)完成Annotation的提取:
Java.lang.annotation.Annotation接口:這個(gè)接口是所有Annotation類型的父接口。
java.lang.reflect.AnnotatedElement接口:該接口代表程序中可以被注解的程序元素。
1.1 Annotation接口
這個(gè)接口比較少用,這個(gè)接口里面有四個(gè)方法:
package java.lang.annotation; public interface Annotation { boolean equals(Object obj); int hashCode(); String toString(); //返回該注解的Class,元素使用了多個(gè)注解的時(shí)候,可以進(jìn)行輸出判斷 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
簡(jiǎn)單獲取方法
2.1 定義注解MyTag
@Target(ElementType.METHOD) //修飾方法 @Retention(RetentionPolicy.RUNTIME) //運(yùn)行時(shí)可以獲取 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","沒(méi)有被mytag注解修飾的方法:" + method.getName()); } } } catch (Exception en) { en.printStackTrace(); } } }
2.3 啟動(dòng)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é)果
運(yùn)行就會(huì)看到輸出,表示已經(jīng)獲取到了對(duì)應(yīng)的實(shí)例
...... 02-18 15:23:41.622 12446-12446/? E/tag: 沒(méi)有被mytag注解修飾的方法:stopServiceAsUser 02-18 15:23:41.622 12446-12446/? E/tag: 沒(méi)有被mytag注解修飾的方法:takeKeyEvents 02-18 15:23:41.622 12446-12446/? E/tag: 沒(méi)有被mytag注解修飾的方法:testNo 02-18 15:23:41.622 12446-12446/? E/tag: 被mytag注解修飾的方法:testYes 02-18 15:23:41.632 12446-12446/? E/tag: 沒(méi)有被mytag注解修飾的方法:toString 02-18 15:23:41.632 12446-12446/? E/tag: 沒(méi)有被mytag注解修飾的方法:triggerSearch 02-18 15:23:41.632 12446-12446/? E/tag: 沒(méi)有被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é)果
將會(huì)輸出以下內(nèi)容,name和age都可以獲取到。
02-18 16:11:53.493 25662-25662/? E/tag: 方法名:testYes的注解值為天平,20
以上就是Android AOP中注解處理解釋器的作用有哪些,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
當(dāng)前名稱:AndroidAOP中注解處理解釋器的作用有哪些
網(wǎng)頁(yè)鏈接:http://jinyejixie.com/article46/jopjhg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開(kāi)發(fā)、網(wǎng)站排名、網(wǎng)站策劃、搜索引擎優(yōu)化、Google、網(wǎng)頁(yè)設(shè)計(jì)公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)