Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android annotation注解的淺層次理解

android annotation注解的淺層次理解

編輯:關於Android編程

在java中有annotation這個東西,因為平時用的也並不是太多,所以一直不是很理解,今天特意花了幾個小時看了下相關的知識點,熟悉了一下annotation的簡單用法。

 

annotation簡答直接用法如下:

一個自定義的annotation主要包括三部分:annotation的定義,annotation的使用,annotation的處理;事實上整個注解機制重點在於最後反射對注解值的使用。

第一步:定義如下:

 

package com.example.annotationtest.annotation;

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

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface ContentView {
    int value();
}

其中包括三個重要的原生注解@Target 、@Retention、@interface

 

@Target表明的是注解的類型,即類注解、方法注解、字段注解等

@Retention表明的是注解的使用范圍,即在源碼中的注解、在Runtime的注解等

@interface是一個自定義注解需要的標志,每個自定義的注解都會有相同的格式

 

第二步:使用的時候注意@Target中所定義的值(以上定義的是類的注解,所以可以按如下方法使用)

 

 

package com.example.annotationtest;

import com.example.annotationtest.annotation.ContentView;
import com.example.annotationtest.annotation.ViewUtils;

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

@ContentView(R.layout.activity_main)
public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ViewUtils.inject(this);
    }
}
其中主要注意兩處,第一處是MainActivity之上的@ContentView(R.layout.activity_main)這裡代表使用ContentView的注解,第二處是ViewUtils.inject(this),這裡是第三步的功能,主要是執行該注解的過程。

 

第三步:最重要的一步,就是通過反射來執行該注解

 

package com.example.annotationtest.annotation;

import android.app.Activity;

import java.lang.reflect.Method;

public class ViewUtils {
    public static void inject(Activity activity) {
        injectObject(activity);
    }

    private static void injectObject(Object handler) {
        Class handlerType = handler.getClass();
        ContentView contentView = handlerType.getAnnotation(ContentView.class);
        if (contentView != null) {
            try {
                Method setContentViewMethod = handlerType.getMethod(setContentView, int.class);
                setContentViewMethod.invoke(handler, contentView.value());
            } catch (Throwable e) {
                e.printStackTrace();
            }
        }
    }
}
與普通的反射唯一的不同之處就是,多了從Annotation中拿到其value的一步。

 

 

ContentView contentView = handlerType.getAnnotation(ContentView.class);//這是拿到Annotation

contentView.value() //這是拿到在第一步中賦的值

 



總共就上面三步,就是一個簡單的注解實現通常安卓開發中需要用到的setContentView(R.layout.activity_main);的功能

 

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved