Java註解介紹

什麼是註解?

Java提供了一種原程序中的元素關聯任何信息和任何元數據的途徑和方法
註解是在Java1.5版本提出的,目前非常的流行,很多主流框架都支持註解,而且自己編寫代碼的時候也會盡量的去用註解,學習註解能夠讀懂別人寫的代碼,特別是框架相關的代碼,讓編程更加簡潔,代碼更加清晰。

Java中的常見註解:

1.按照來源分
JDK自帶註解

@Override 如果想重寫父類的方法,比如toString()方法的話,在方法前面加上@Override 系統可以幫你檢查方法的正確性
@Deprecated 若某類或某方法加上該註解之後,表示此方法或類不再建議使用,調用時也會出現刪除線,但並不代表不能用,只是說,不推薦使用,因爲還有更好的方法可以調用
@SuppressWarnings 忽略指定警告

第三方註解

Spring中的 @Autowired @Service @Repository
Mybatis中的 @InsertProvider @UpdateProvider @Options

元註解

是指註解的註解,包括@Retention @Target @Document @Inherited四種
@Target({ElementType.METHOD,ElementType.TYPE}) 註解作用域
作用域列表:
CONSTRUCTOR 構造方法聲明
FIELD 字段聲明
LOCAL_VARIABLE 局部變量聲明
METHOD 方法聲明
PACKAGE 包聲明
PARAMETER 參數聲明
TYPE 類,接口
@Retention(RetentionPolicy.RUNTIME) 生命週期
類型:
SOURCE只在源碼顯示,編譯時會丟棄
CLASS 編譯時會記錄到class中,運行時忽略
RUNTIME 運行時存在,可以通過反射讀取
@Inherited 允許子類繼承
@Documented 生成javadoc時會包含註解

自定義註解
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
//如果註解只有一個成員,則成員名必須取名爲value(),在使用時可以忽略成員名和賦值號(=)
//註解類可以沒有成員,沒有成員的註解稱爲標識註解
public @interface Description { //使用@interface關鍵字定義註解
    //成員類型是受限的,合法的類型包括原始類型及String,Class,Annotation,Enumeration
    String desc(); //成員以無參無異常方式聲明
    String author();
    int age() default 18;//可以用default爲成員指定一個默認值
}

使用自定義註解
語法:

@<註解名>(<成員名1>=<成員值1>,<成員名1>=<成員值1>,...)
@Description(desc="I am eyeColor",author="Mooc boy",age=18)
public String eyeColor(){
    return "red";    
}
2.按照運行機制分

源碼註解 :註解只在源碼中存在,編譯成.class文件就不存在了
編譯時註解: 註解在源碼和.class文件中都存在
運行時註解: 在運行階段還起作用,甚至會影響運行邏輯的註解

解析註解

概念:通過反射獲取類,函數或成員上的運行時註解信息,從而實現動態控制程序運行的邏輯
用法如下:

1.使用類加載器加載類

class c = Class.forName(“類的全限定名”);//傳入string類型參數,要求jvm查找並加載指定的類,返回的是一個class對象的引用

2.找到類上面的註解

boolean isExist = c.isAnnotationPresent(Description.class);//如果指定類型的註解存在於此元素上,返回true,否則返回false

3.拿到註解實例

Description d = (Description)c.getAnnotation(Description.class);//指定註解類型返回在此元素上的註解(如果存在),否則返回null
或者c.getAnnotations();拿到全部的註解

4.找到方法上的註解

Method[] ms = c.getMethods();//返回某個類的所有公用(public)方法包括其繼承類的公用方法,當然也包括它所實現接口的方法
for(Method m:ms){
boolean isExist = c.isAnnotationPresent(Description.class);
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章