Android中Annotation使用

首先建立一個項目:java

這個項目很簡單,就三個類,一個activity,一個註解,一個註解工具類,首先看一下activity中的代碼:android

package com.gefufeng.annotationdemo;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;


public class MainActivity extends Activity {
	@ViewInject(value = R.id.text,defaultText = "你好註解")
	private TextView text;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		InjectUtils.init(this);  
	}

}

這個activity很是簡單,就是爲了演示annotation用的,其中有一個Textview,id爲R.id.text,而後我爲它加上了一個自定義註解Viewinject,下面看一下這個註解:app

package com.gefufeng.annotationdemo;

import java.lang.annotation.Documented;
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)
@Documented
public @interface ViewInject {
	int value();
	String defaultText();

}

這個註解中我先簡單的介紹一下幾個名詞:ide

1.@interface : 加上它ViewInject就表示一個自定義的註解工具

2.@Target :表示這個註解是給誰用的,是一個類的,仍是一個方法呢,仍是一個變量呢,等等this

3.@Retention:這個註解的生命週期,有的註解在原文件中有效,有的在class文件中還有效,有的在運行時還有效.net

4.@Ducumented:Documented是一個標記註解,沒有成員,用於描述其它類型的annotation應該被做爲被標註的程序成員的公共APIcode

OK,註解中有兩個方法,就是聲明瞭兩個參數,方法的名稱就是參數的名稱。blog

下面看一下InjectUtils類:生命週期

package com.gefufeng.annotationdemo;

import java.lang.reflect.Field;

import android.app.Activity;
import android.view.View;
import android.widget.TextView;

public class InjectUtils {
	
	public static void init(Activity ac){
		Class<?> c = ac.getClass();
		Field[] fields = c.getDeclaredFields();
		for (Field f : fields) {
			ViewInject viewInject = f.getAnnotation(ViewInject.class);
			if (viewInject != null) {
				int id = viewInject.value();
				String defaultText = viewInject.defaultText();
				View view = ac.findViewById(id);
				if (view instanceof TextView) {
					((TextView)view).setText(defaultText);
				}
				f.setAccessible(true);
				try {
					f.set(ac, view);
				} catch (IllegalAccessException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (IllegalArgumentException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		
		
	}

}

這個類也比較簡單,就一個靜態的init方法,用於在activity中初始化。

首先找出activity中公開的變量,而後遍歷這些變量,查找哪些變量有ViewInject註解,若是有,取出value和defaultText的值,最後調用f.set(ac, view);對於field.set()方法,源碼中的解釋爲:

Sets the value of the field in the specified object to the value. This reproduces the effect of {@code object.fieldName = value}

OK,一個註解初始化view的例子到此完成,運行這個android程序,這個textview就已被初始化,默認值爲「你好註解」。

關於註解的知識這裏沒作系統的介紹,只是在android演示了怎麼使用註解

關於反射的知識我寫了一個demo: http://my.oschina.net/gef/blog/680386,能夠看一下

相關文章
相關標籤/搜索