標籤:etc 類型 編譯 警告 tde doc warnings present not
19.Java註解1.Java內建註解----註解代碼
@Deprecated //不推薦使用的過時方法
@Deprecatedpublic void badMethod(){ System.out.println("I am a old function");}
@Override //必須是覆蓋父類(介面)的函數
@Overridepublic String toString(){ return "override toString()";}
@SuppressWarnings //關閉不恰當的編譯期間警告
2.自訂註解
a.沒有任何元素的註解---標記註解
b.普通註解定義、普通註解的使用
/** * 是否是類 */public @interface IsClass { String value(); boolean isClass() default true;}
解釋:該註解有兩個元素value和isClass,isClass元素的目的是標記對象是否為類,該元素預設為真。
當註解的元素都有預設值的時候,名為value的元素賦值時不用寫名稱
3.元註解
說明:元註解是用來修飾註解的註解,限定了註解的注釋範圍,註解的生命週期【源碼級,運行時層級,Class檔案級】,是否可以繼承,是否建立文檔等
4.運行時註解
像Spring一類的註解都與運行時註解有很大的關係,下面是一個利用註解,擷取二維表的表名稱,表的行名稱,表的列值三個屬性
4.1定義運行時註解
- Table是二維表的表格名稱
- Column是二維表的列
- Key是二維表的行
import java.lang.annotation.*;/** * Created by yangyun on 2016/12/27. */@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface Column { String value();}@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)@interface Key{ String value();}@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@interface Table { String value();//表格的名稱}
4.2使用註解並編寫相關的註解資訊擷取類
- Tables類中包含了我們所需要的資訊,Table註解註解在Table類上,Key和Column註解在Field上
- GetInformation類是擷取相關的註解資訊的操作類,利用的是Java的反射機制
import java.util.List;/** * Created by yangyun on 2016/12/27. */@Empty(field = "Not Empty")@IsClass("value屬性的值")public class Annotation { public static void main(String[] args) { System.out.format("tableName:%s\n",GetInformation.getName(Tables.class)); try { System.out.format("key:%s\n",GetInformation.getKey(Tables.class)); } catch (NoSuchFieldException e) { e.printStackTrace(); } System.out.format("columns:%s\n",GetInformation.getCols(Tables.class)); }}@Table("students")class GetInformation{ public static String getName(Class<Tables> tablesClass){ String strTableName=null; if(tablesClass.isAnnotationPresent(Table.class)){ Table tableName=tablesClass.getAnnotation(Table.class);//表格名稱 strTableName=tableName.value(); } return strTableName; } public static String getKey(Class<Tables> tablesClass) throws NoSuchFieldException { Field field=tablesClass.getDeclaredField("key");//擷取private屬性 String strKey=null; if(field!=null){ Key key=field.getAnnotation(Key.class); if(key!=null){ strKey=key.value(); } } return strKey; } public static List<String> getCols(Class<Tables> tablesClass){ List<String> columns=new ArrayList<String>(); Field[] fields=tablesClass.getDeclaredFields(); if(fields!=null) { for (Field field : fields) { if (field.isAnnotationPresent(Column.class)) { columns.add(field.getAnnotation(Column.class).value()); } } } return columns; }}@Table("Students")class Tables{ @Key("Id") private String key; @Column("name") private String col1; @Column("sex") private String col2;}
4.3 主要的API介紹(不細說屬於反射的知識)
- 1.myClass.getAnnotations()---擷取該類所有的註解
- 2.myClass.getAnnotation(Class annotationType)—擷取特定註解類型
- 3.myClass.isAnnotationPresent(Class annotationType)—判斷是否存在特定類型的註解
- 4.myClass.getDeclareAnnotations()— 擷取該類的所有註解不包括從父類中繼承的註解
19.Java 註解