編輯:關於Android編程
@DBTableY(name = "YYD__DB") public class DB { @DBColumnY(name = "column11xx") public String column1; @DBColumnY(name = "column22xx") public String column2;
} 定義
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface DBTableY { String name() default "YUYIDONG11"; } @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD}) public @interface DBColumnY { String name() default "YUYIDONG"; }
通過 @interface 定義,注解名即為自定義注解名 注解配置參數名為注解類的方法名,且: a. 所有方法沒有方法體,沒有參數沒有修飾符,實際只允許 public & abstract 修飾符,默認為 public ,不允許拋異常 b. 方法返回值只能是基本類型,String, Class, annotation, enumeration 或者是他們的一維數組 c. 若只有一個默認屬性,可直接用 value() 函數。一個屬性都沒有表示該 Annotation 為 Mark Annotation 可以加 default 表示默認值 元 Annotation @Documented 是否會保存到 Javadoc 文檔中 @Retention 保留時間,可選值 SOURCE(源碼時),CLASS(編譯時),RUNTIME(運行時),默認為 CLASS,SOURCE 大都為 Mark Annotation,這類 Annotation 大都用來校驗,比如 Override, SuppressWarnings 作用:表示需要在什麼級別保存該注釋信息,用於描述注解的生命周期(即:被描述的注解在什麼范圍內有效) 取值(RetentionPoicy)有: 1.SOURCE:在源文件中有效(即源文件保留) 2.CLASS:在class文件中有效(即class保留) 3.RUNTIME:在運行時有效(即運行時保留) @Target 可以用來修飾哪些程序元素,如 TYPE, METHOD, CONSTRUCTOR, FIELD, PARAMETER 等,未標注則表示可修飾所有。 作用:用於描述注解的使用范圍(即:被描述的注解可以用在什麼地方) 取值(ElementType)有: 1.CONSTRUCTOR:用於描述構造器 2.FIELD:用於描述域 3.LOCAL_VARIABLE:用於描述局部變量 4.METHOD:用於描述方法 5.PACKAGE:用於描述包 6.PARAMETER:用於描述參數 7.TYPE:用於描述類、接口(包括注解類型) 或enum聲明 @Inherited 是否可以被繼承,默認為 false 當 @Inherited annotation類型標注的annotation的Retention是RetentionPolicy.RUNTIME,則反射API增強了這種繼承性。如果我們使用java.lang.reflect去查詢一個 @Inherited annotation類型的annotation時,反射代碼檢查將展開工作:檢查class和其父類,直到發現指定的annotation類型被發現,或者到達類繼承結構的頂層。 注解 使用 @interface自定義注解時,自動繼承了java.lang.annotation.Annotation接口,由編譯程序自動完成其他細節。在定義注解時,不能繼承其他的注解或接口。 @interface用來聲明一個注解,其中的每一個方法實際上是聲明了一個配置參數。方法的名稱就是參數的名稱,返回值類型就是參數的類型(返回值類型只能是基本類型、Class、String、enum)。可以通過default來聲明參數的默認值。 public @interface 注解名 {定義體} 注解參數的可支持數據類型: 1.所有基本數據類型(int,float,boolean,byte,double,char,long,short) 2.String類型 3.Class類型 4.enum類型 5.Annotation類型 6.以上所有類型的數組 解析 運行時 Annotation 解析 運行時 Annotation 指 @Retention 為 RUNTIME 的 Annotation
method.getAnnotation(AnnotationName.class); method.getAnnotations(); method.isAnnotationPresent(AnnotationName.class); getAnnotation(AnnotationName.class) 表示得到該 Target 某個 Annotation 的信息,因為一個 Target 可以被多個 Annotation 修飾 getAnnotations() 則表示得到該 Target 所有 Annotation isAnnotationPresent(AnnotationName.class) 表示該 Target 是否被某個 Annotation 修飾 Class clazz = DB.class; if (clazz.isAnnotationPresent(DBTableY.class)) { DBTableY dbTableY = (DBTableY) clazz.getAnnotation(DBTableY.class); Log.i("yyd", "dbTableY.name()--->" + dbTableY.name()); Field[] fields = clazz.getFields(); for (Field field : fields) { DBColumnY dbColumnY = field.getAnnotation(DBColumnY.class); Log.i("yyd", "dbColumnY.name()--->" + dbColumnY.name()); Log.i("yyd", "field.getName()--->" + field.getName()); } }
編譯時 Annotation 解析 編譯時 Annotation 指 @Retention 為 CLASS 的 Annotation,甴編譯器自動解析。需要做的 自定義類集成自 AbstractProcessor 重寫其中的 process 函數 編譯器在編譯時自動查找所有繼承自 AbstractProcessor 的類,然後調用他們的 process 方法去處理。
SupportedAnnotationTypes({ "com.yydcdut.test.annotation.DBColumnY" }) public class DBColumnProcessor extends AbstractProcessor { @Override public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment env) { for (TypeElement te : annotations) { for (Element element : env.getElementsAnnotatedWith(te)) { DBColumnY dbColumnY = element.getAnnotation(DBColumnY.class); Log.i("yyd",element.getEnclosingElement().toString()); } } return false; } }
SupportedAnnotationTypes 表示這個 Processor 要處理的 Annotation 名字。 process 函數中參數 annotations 表示待處理的 Annotations,參數 env 表示當前或是之前的運行環境。 process 函數返回值表示這組 annotations 是否被這個 Processor 接受,如果接受後續子的 rocessor 不會再對這個 Annotations 進行處理。
本文目的如下:1、加一個設置初始密碼的功能2、讓手勢單點生效3、讓繪制路徑的中間點自動加入軌跡(例如選中第一排的1位和3位時2位也能自動選中)4、一些其它方面的優化&nb
在實現搜索功能的時候,比如藍牙搜索,附近熱點搜索等,通常我們需要一個比較友好的界面,以下通過自定義View來實現一個搜索界面。效果圖如下:當實現一個這樣的動畫的時候,思路
發送短信 發送短信的時候,我們要使用的action是Intent.ACTION_SENDTO,並且要指定其URI是smsto:協議,這樣能保證是短信應用接
本文會實現一個類似網易新聞(不說網易新聞大家可能不知道大概是什麼樣子)點擊超多選項卡,選項卡動態滑動的效果。首先來看看布局,就是用HorizontalScro