日常開發(fā)中走搁,經(jīng)常會(huì)用的很多的注解框架來簡(jiǎn)化一些業(yè)務(wù)邏輯独柑,便于我們更加專注于功能的開發(fā),提升開發(fā)效率私植,常用的注解框架忌栅,最早的有AFinal,以及目前流行的Dagger 2曲稼,BufferKnife等都使用了注解的實(shí)現(xiàn)索绪,解脫了以往findViewById,onClick等的過程贫悄,但注解主要用到了那些技能點(diǎn)瑞驱,怎么實(shí)現(xiàn),還需要一步步的探索窄坦。
這里實(shí)現(xiàn)findViewById的注解
第一步:新建一個(gè)Annotation的java文件唤反,在AndroidStudio中新建Java Class中kind選項(xiàng)中選中Annotation則可以
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ViewInject {
public abstract int value();
}
其中Target是添加其修飾范圍凳寺,取值(ElementType)是來源于Java.lang.annotation.ElementType中的枚舉類型元素:
1.CONSTRUCTOR:用于描述構(gòu)造器
2.FIELD:用于描述域
3.LOCAL_VARIABLE:用于描述局部變量
4.METHOD:用于描述方法
5.PACKAGE:用于描述包
6.PARAMETER:用于描述參數(shù)
7.TYPE:用于描述類、接口(包括注解類型) 或enum聲明
添加Retention表示需要在什么級(jí)別保存該注釋信息彤侍,用于描述注解的生命周期(即:被描述的注解在什么范圍內(nèi)有效),取值(RetentionPoicy)來源于java.lang.annotation.RetentionPolicy的枚舉類型值:
1.SOURCE:在源文件中有效(即源文件保留)
2.CLASS:在class文件中有效(即class保留)
3.RUNTIME:在運(yùn)行時(shí)有效(即運(yùn)行時(shí)保留
第二步新建一個(gè)ViewUtils的Java class文件肠缨,至于文件名ViewUtils可以自己發(fā)揮,具體代碼如下:
import android.app.Activity;
import android.view.View;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class ViewUtils {
public static void inject(final Activity activity){
Class clazz=activity.getClass();
Field [] declaredFields=clazz.getDeclaredFields();
for (int i=0;i<declaredFields.length;i++){
Field field=declaredFields[i];
field.setAccessible(true);
ViewInject annotation=field.getAnnotation(ViewInject.class);
if (annotation==null)continue;
int id=annotation.value();
View view=activity.findViewById(id);
try {
field.set(activity,view);
}catch (Exception e){
e.printStackTrace();
}
}
}
}
這里主要用到了反射技術(shù)的實(shí)現(xiàn)盏阶,拿到在Activity中添加的注解變量進(jìn)行執(zhí)行晒奕。
第三步,在Activity中的使用
1)在onCreate方法中綁定
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ViewUtils.inject(this);
}
2)聲明控件進(jìn)行綁定
@ViewInject(value = R.id.fab)
FloatingActionButton fab;
至此簡(jiǎn)單的注解已經(jīng)實(shí)現(xiàn)名斟,可以在自己的項(xiàng)目中添加使用.如果只是簡(jiǎn)單的findViewById或者onClick的注解脑慧,完全可以自己實(shí)現(xiàn),至于反射將會(huì)在下一篇中講解實(shí)現(xiàn).
參考博文:
[https://www.cnblogs.com/liuys635/p/10247946.html]