標籤:rip 代碼 type doc tar gravity target instance present
一、簡介
啥是註解,不懂的可以先看我上一篇文章。
在android 裡面 註解主要用來幹這麼幾件事:
二、Support Annotations栗子
這裡使用官方的一個庫,說明在開發中的簡單一個應用。
2.1 導包
在建立項目的時候會自動導的,可以看build.gradle中的依賴dependencies是這樣的。
dependencies { compile fileTree(dir: ‘libs‘, include: [‘*.jar‘]) androidTestCompile(‘com.android.support.test.espresso:espresso-core:2.2.2‘, { exclude group: ‘com.android.support‘, module: ‘support-annotations‘ }) compile ‘com.android.support:appcompat-v7:25.1.1‘ testCompile ‘junit:junit:4.12‘}
如果沒有的話,自己在build.gradle的依賴添加(xx.x.x為你的compileSdkVersion版本號碼):
compile ‘com.android.support:support-annotations:xx.x.x‘
2.2 使用
這時候就可以使用一些support-annotations提供的註解,下面舉一些栗子:
- @NonNull
test方法參數添加了一個NonNull註解,然後我們傳遞一個空的參數過去。
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); String s = null; test(s); } public void test(@NonNull String s){ System.out.println(s); }}
IDE就會提示警告
- @StringRes
再定義testString方法參數添加了一個StringRes註解,然後我們傳遞一個數字過去。
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); testString(112312); testString(R.string.app_name); } public void testString(@StringRes int s){ System.out.println(s); }}
IDE就會提示
三、實現自己的ButterKnife
經過之前的知識,我們已經知道註解的原理和使用了,這裡實現ButterKnife的一個簡易功能,View的注入: 一個註解,一個解析器即可。
3.1 BindView註解
@Target(ElementType.FIELD) //解析常量@Retention(RetentionPolicy.RUNTIME) //運行時public @interface BindView { int value() default -1; //標識控制項}
3.2 BindViewParser解析器
/** * Created by Litp on 2017/2/17. */public class BindViewParser { /** * 傳遞activty或者View 對象,使用反射擷取view變數 * @param object */ public static void inject(Object object) { try { parse(object); } catch (Exception e) { e.printStackTrace(); } } /** * 解析擷取值 * @param object * @throws Exception */ public static void parse(Object object) throws Exception { final Class<?> clazz = object.getClass(); View view = null; //擷取clazz的變數,不論private還是public Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { //這個變數 是否有BindView註解 if (field.isAnnotationPresent(BindView.class)) { //擷取這個變數對應的註解 BindView injectView = field.getAnnotation(BindView.class); //擷取值 int id = injectView.value(); if (id <= 0) { throw new Exception("View的id不可為空"); } else { //設定可以訪問 field.setAccessible(true); //擷取view if (object instanceof View) { view = ((View) object).findViewById(id); } else if (object instanceof Activity) { view = ((Activity) object).findViewById(id); } //設定View field.set(object, view); } } } }}
3.3 Activity使用
public class MainActivity extends AppCompatActivity { //使用註解標識變數 @BindView(R.id.tv_test) TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //傳遞當前activty給解析器,進行初始化view BindViewParser.inject(this); //這裡就已經是初始化完畢了,可以進行使用了 textView.setText("測試自己的注入demo"); }}
Android AOP之路三 Android上的註解