Androidは、独自の注釈(@interface)の優雅さと便利さを教えてくれます.

2955 ワード

私たちは普段、Webプロジェクトを開発するとき、SSHを使って私たちのプロジェクトを構築することがよくあります.注釈でコード量を減らすのが好きなプログラム猿もたくさんいます.しかし、キックアスプログラム猿たちは、この注釈がどのように実現されたのか考えたことがありますか.注釈のような優雅なコードをどう書けばいいのでしょうか.私たちが普段コードを書いているときに新しいものを見た後、常に探求の精神を保っている以外は.また、みんなが大きな情熱を出してコードを真剣に研究し、几帳面に扱う精神も必要です.このようにしてこそ、自分を進歩させ、より優雅なコードを書くことができます.今日は注釈クラスを書いてandroidコントロールを初期化します.
くだらないことは言わないで、まずコードを1段ください.
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の2つはJDKが提供するメタ注釈である.下を見てください.
@Target(ElementType.TYPE)/インタフェース、クラス、列挙、注記@Target(ElementType.FIELD)/フィールド、列挙された定数@Target(ElementType.METHOD)/メソッド@Target(ElementType.PARAMMETER)//メソッドパラメータ@Target(ElementType.CONTRUCTOR)//コンストラクション関数@Target(ElementType.LOCAL_VARABLE)//ローカル変数@Target(ElementType.ANNOTATION_TYPE)//注記@Target(ElementType.PACKAGE)/パッケージ@Retention(RetentionPolicy.RUNTIME)//注記はclassバイトコードファイルに存在し、実行時に反射で取得できます.
簡単に説明してTYPEという表現はクラス注釈です.例えばstruts 2と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()
ここまで書いて、皆さんはきっと分かりました.今日はまずそうしましょう.