Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 關於android注解的思考和實現方式

關於android注解的思考和實現方式

編輯:關於Android編程

我們平常在開發web項目的時候,經常會使用SSH來構建我們的項目,也有很多程序猿喜歡用注解來減少代碼量。但是各位屌絲程序猿們,大家有沒有想過這個注解是怎麼實現的呢。我們又該如何寫出像注解這麼優雅的代碼呢。除了我們平時在寫代碼的時候看到了新的東西之後始終保持探索的精神。還要有大家拿出極大的熱情刻苦專研和對待代碼一絲不苟的精神。這樣才能使得自己進步,寫出更加優雅的代碼。今天我帶大家來寫一個注解類,初始化android控件。

廢話少說,先上一段代碼。

package com.example.volley.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

//聲明在field
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ViewInject {

	int value() default 0;
}

首先看這段代碼,相信大家之前沒有寫過的童鞋肯定看的一頭霧水。所以我解釋一些。@interface這是java用來定義一個注解類。

@Target和@Retention這兩個是JDK提供的元注解。請看下面。

@Target(ElementType.TYPE) //接口、類、枚舉、注解
   @Target(ElementType.FIELD) //字段、枚舉的常量
   @Target(ElementType.METHOD) //方法
   @Target(ElementType.PARAMETER) //方法參數
   @Target(ElementType.CONSTRUCTOR) //構造函數
   @Target(ElementType.LOCAL_VARIABLE)//局部變量
   @Target(ElementType.ANNOTATION_TYPE)//注解
   @Target(ElementType.PACKAGE) ///包
@Retention(RetentionPolicy.RUNTIME) // 注解會在class字節碼文件中存在,在運行時可以通過反射獲取到

簡單解釋一下,比如ElementType.TYPE這個表示是一個類注解。比如struts2和springMVC的@controller

這個注解。

RetentionPolicy.RUNTIME表示會在class文件中運行是通過反射得到。

 

注解類寫好了,下面關鍵的是如何注解解析。

老辦法,先上代碼。

package com.example.volley.annotation;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

import android.app.Activity;

public class ViewUtils {

 public static ViewUtils viewUtils;
 public Activity ctx;
 public ViewUtils(Activity ctx) {
  this.ctx = ctx;
  autoInjectAllField();
 }
 
 public static ViewUtils inject(Activity ctx){
  if (viewUtils!=null) {
   return viewUtils;
  }else{
   viewUtils = new ViewUtils(ctx);
   return viewUtils;
  }
 }
 
 private void autoInjectAllField() {
  try {
   Class clazz = ctx.getClass();
      
   Field[] fields = clazz.getDeclaredFields();
   for (Field field : fields) {
    if (field.isAnnotationPresent(ViewInject.class)) {
     ViewInject inject = field.getAnnotation(ViewInject.class);
     int id = inject.value();
     if(id > 0){
      field.setAccessible(true);
      field.set(ctx, ctx.findViewById(id));
     }
    }
   }
  } catch (Exception e) {
   e.printStackTrace();
  }
 
 }
}



通過ctx.getclass()得到實體類。然後得到這個類中所有的注解跟ViewInject注解類匹配。如果匹配成功,則set(ctx,ctx.findById());

寫到這裡,大家想必都明白了。今天先這樣,見。
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved