為了在android開發(fā)中省去一些重復的代碼輸入,我們現(xiàn)在都在使用butterknife**這樣的框架韧骗,進行代碼的簡化能犯。使用這種框架能提供我們很多的方便,但是我們也要了解它的實現(xiàn)原理和方法织阳。
(1)用的知識
1.使用了java中的自定義注釋(Annotation)
2.使用了反射原理(反射原理大家可以在網上搜索學習)
(2)Annotation介紹
1.Annotation是用那修飾類,屬性砰粹,方法唧躲。
2.元注釋:是專用來注釋其他注釋。
//元注釋的格式如下
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface onClick {
int[] value() default {};
}
大致了解了元注釋的實現(xiàn)伸眶,我們來看下元格式的基本語法惊窖。
元注釋分4種:
1.@Target :表示Annotation可以用在什么地方
它的取值為:
2.@Retention:表示什么級別保持注釋信息
它的取值為:
3.@Documented:表示在Javadocs中包含這個注解刽宪。
4.@Inherited :表示允許子類繼承父類中的注解厘贼。
3.實現(xiàn)流程
實現(xiàn)流程:定義一個注釋類,在使用的地方調用圣拄,關鍵是通過反射的方法調用系統(tǒng)中的對應函數(shù)嘴秸。
下面通過自定義android中的設置布局的例子,了解其流程:
1.定義注釋類(ContentView.java)
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface ContentView {
int value();
}
2.activity中調用注釋
@ContentView(R.layout.inject_view)
public class InjectActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ViewInjectUtils.injectContentView(this);
}
}
3.關鍵步驟實現(xiàn)反射回調
public class ViewInjectUtils {
//設置布局
public static void injectContentView(Activity activity) {
Class a = activity.getClass();
if (a.isAnnotationPresent(ContentView.class)) {
// 得到activity這個類的ContentView注解
ContentView contentView = (ContentView) a.getAnnotation(ContentView.class);
// 得到注解的值
int layoutId = contentView.value();
// 使用反射調用setContentView
try {
Method method = a.getMethod("setContentView", int.class);
method.setAccessible(true);
method.invoke(activity, layoutId);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
}
4.反射回調的實現(xiàn)
@Target取值不同實現(xiàn)回調時候調用的方法就不同庇谆,下面介紹下
ElementType.TYPE岳掐,ElementType.METHOD,ElementType.FIELD回調的方法
(1)ElementType.TYPE定義類饭耳,接口和enum聲明串述。在android中,可以認為是定義activity中的布局文件寞肖。

(2)ElementType.FIELD定義域聲明纲酗。在android中,可以認為是定義activity中每個控件新蟆。
(3)ElementType.METHOD定義方法觅赊。在android中,可以認為是定義activity中點擊事件琼稻。
1.定義注釋類
2.定義一個注釋類型聲明
3.調用事件
使用了動態(tài)代理