前言#
反射和注解的基本知識(shí)我們都已經(jīng)了解了省店,這一篇來(lái)具體看看他倆如何結(jié)合使用嚣崭,離我們的最終目標(biāo)越來(lái)越近了肥缔。
正文#
現(xiàn)在來(lái)寫一個(gè)通過(guò)注解來(lái)實(shí)現(xiàn)setContentView()的功能的Demo芒划。
首先我們需要自定義一個(gè)注解逐沙,我們命名為ContentView:
package com.lzp.annotationstudy;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* Created by li.zhipeng on 2017/3/9.
*
* 注解測(cè)試類
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface ContentView {
int value();
}
ContentView注解用來(lái)注解某一個(gè)類(TYPE)超埋,在運(yùn)行時(shí)可以通過(guò)反射獲取到具體的信息搏讶。value()之前介紹過(guò),如果注解只有一個(gè)屬性霍殴,系統(tǒng)推薦用value媒惕,注解中的值會(huì)以鍵值對(duì)的形式保存,就是屬性的名稱對(duì)應(yīng)自身的值来庭,而系統(tǒng)默認(rèn)是value就是其中的一個(gè)鍵妒蔚,這樣的好處之后會(huì)看到。
定義好注解月弛,現(xiàn)在就要通過(guò)反射來(lái)實(shí)現(xiàn)具體的功能了:
package com.lzp.annotationstudy;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* Created by li.zhipeng on 2017/3/9.
*
* 注解工具類
*/
public class AnnotationUtils {
public static void injectObject(Object handler){
// 拿到參數(shù)的Class類型
Class<?> handleType = handler.getClass();
// 獲取Class類型上的ContentView注解
ContentView contentView = handleType.getAnnotation(ContentView.class);
if (contentView != null){
try {
// 通過(guò)反射找到Class類型中的setContentView(int param)方法
Method setContentViewMethod = handleType.getMethod("setContentView", int.class);
// 調(diào)用setContentView(int param)肴盏,第一個(gè)是操作的對(duì)象,第二個(gè)是方法的參數(shù)
setContentViewMethod.invoke(handler, contentView.value());
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
}
代碼中已經(jīng)有很詳細(xì)的注釋了帽衙,接下來(lái)看看MainActivity中的代碼:
package com.lzp.annotationstudy;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
//@ContentView(value = R.layout.activity_main)
@ContentView(R.layout.activity_main)
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
AnnotationUtils.injectObject(this);
}
}
這里看到了推薦使用value的好處菜皂,因?yàn)槊Q默認(rèn)是value,所以我們就不需要寫“value = ”了厉萝,如果是其他的名稱恍飘,例如name之類的,就必須要寫了冀泻。
看一下運(yùn)行效果:
ok3B隆!弹渔!
總結(jié)#
到這里所有的基礎(chǔ)部分就都已經(jīng)結(jié)束了胳施,demo中反射了類的方法, 反射屬性也大同小異肢专,沒什么太大的差別舞肆,下一篇直奔主題:自定義屌爆了的數(shù)據(jù)庫(kù)框架焦辅。