框架 = 注解 + 反射 + 設(shè)計模式
1. 注解概述
注解(Annotation
)是從JDK5.0開始引入,以“@注解名”在代碼中存在。
Annotation 可以像修飾符一樣被使用,可用于修飾包、類、構(gòu)造器、方法、成員變量、參數(shù)、局部變量的聲明。還可以添加一些參數(shù)值,這些信息被保存在 Annotation 的 “name=value” 對中。
注解可以在類編譯、運行時進行加載,體現(xiàn)不同的功能。
2. 注解與注釋
注解也可以看做是一種注釋,通過使用 Annotation,可以在不改變原有邏輯的情況下,在源文件中嵌入一些補充信息。但是,注解,不同于單行注釋和多行注釋。
- 對于單行注釋和多行注釋是給程序員看的。
- 而注解是可以被編譯器或其他程序讀取的。程序還可以根據(jù)注解的不同,做出相應(yīng)的處理。
3. 注解的重要性
在JavaSE中,注解的使用目的比較簡單,例如標記過時的功能,忽略警告等。在JavaEE/Android中注解占據(jù)了更重要的角色,例如用來配置應(yīng)用程序的任何切面,代替JavaEE舊版中所遺留的繁冗代碼和XML配置等。
未來的開發(fā)模式都是基于注解的,JPA是基于注解的,Spring2.5以上都是基于注解的,Hibernate3.x以后也是基于注解的,Struts2有一部分也是基于注解的了。
4. 常見的Annotation作用
4.1 生成文檔相關(guān)的注解
@author
: 標明開發(fā)該類模塊的作者,多個作者之間使用,分割@version
: 標明該類模塊的版本@see
: 參考轉(zhuǎn)向,也就是相關(guān)主題@since
: 從哪個版本開始增加的@param
: 對方法中某參數(shù)的說明,如果沒有參數(shù)就不能寫@return
: 對方法返回值的說明,如果方法的返回值類型是void就不能寫@exception
: 對方法可能拋出的異常進行說明 ,如果方法沒有用throws顯式拋出的異常就不能寫
4.2 在編譯時進行格式檢查(JDK內(nèi)置的三個基本注解)
@Override
: 限定重寫父類方法,該注解只能用于方法
- 用于檢測被標記的方法為有效的重寫方法,如果不是,則報編譯錯誤!
- 只能標記在方法上。
- 它會被編譯器程序讀取。
@Deprecated
: 用于表示所修飾的元素(類,方法等)已過時。通常是因為所修飾的結(jié)構(gòu)危險或存在更好的選擇
- 用于表示被標記的數(shù)據(jù)已經(jīng)過時,不推薦使用。
- 可以用于修飾 屬性、方法、構(gòu)造、類、包、局部變量、參數(shù)。
- 它會被編譯器程序讀取。
@SuppressWarnings
: 抑制編譯器警告 - 抑制編譯警告。當我們不希望看到警告信息的時候,可以使用
SuppressWarnings
注解來抑制警告信息 - 可以用于修飾類、屬性、方法、構(gòu)造、局部變量、參數(shù)
- 它會被編譯器程序讀取。
- 可以指定的警告類型有(了解)
-
all
,抑制所有警告 -
unchecked
,抑制與未檢查的作業(yè)相關(guān)的警告 -
unused
,抑制與未用的程式碼及停用的程式碼相關(guān)的警告 -
deprecation
,抑制與淘汰的相關(guān)警告 -
nls
,抑制與非 nls 字串文字相關(guān)的警告 -
null
,抑制與空值分析相關(guān)的警告 -
rawtypes
,抑制與使用 raw 類型相關(guān)的警告 -
static-access
,抑制與靜態(tài)存取不正確相關(guān)的警告 -
static-method
,抑制與可能宣告為 static 的方法相關(guān)的警告 -
super
,抑制與置換方法相關(guān)但不含 super 呼叫的警告 - …
-
5. 元注解
JDK1.5在java.lang.annotation包定義了4個標準的meta-annotation
類型,它們被用來提供對其它 annotation類型作說明。
(1)@Target
:用于描述注解的使用范圍
- 可以通過枚舉類型
ElementType
的10個常量對象來指定 - TYPE,METHOD,CONSTRUCTOR,PACKAGE…
(2)@Retention
:用于描述注解的生命周期
- 可以通過枚舉類型
RetentionPolicy
的3個常量對象來指定 - SOURCE(源代碼)、CLASS(字節(jié)碼)、RUNTIME(運行時)
- 唯有RUNTIME階段才能被反射讀取到。
(3)@Documented
:表明這個注解應(yīng)該被 javadoc工具記錄。
(4)@Inherited
:允許子類繼承父類中的注解
示例代碼:
package java.lang;
import java.lang.annotation.*;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
package java.lang;
import java.lang.annotation.*;
import static java.lang.annotation.ElementType.*;
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
String[] value();
}
package java.lang;
import java.lang.annotation.*;
import static java.lang.annotation.ElementType.*;
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
public @interface Deprecated {
}
6. 自定義注解
一個完整的注解應(yīng)該包含三個部分: (1)聲明
、 (2)使用
、 (3)讀取
聲明自定義注解:
【元注解】
【修飾符】 @interface 注解名{
【成員列表】
}
- 自定義注解可以通過四個元注解
@Retention
,@Target
,@Inherited
,@Documented
,分別說明它的聲明周期,使用位置,是否被繼承,是否被生成到API文檔中。 -
Annotation
的成員在Annotation
定義中以無參數(shù)有返回值的抽象方法的形式來聲明,我們又稱為配置參數(shù)。返回值類型只能是八種基本數(shù)據(jù)類型、String
類型、Class
類型、enum
類型、Annotation
類型、以上所有類型的數(shù)組 - 可以使用
default
關(guān)鍵字為抽象方法指定默認返回值 - 如果定義的注解含有抽象方法,那么使用時必須指定返回值,除非它有默認值。格式是“方法名 = 返回值”,如果只有一個抽象方法需要賦值,且方法名為value,可以省略“value=”,所以如果注解只有一個抽象方法成員,建議使用方法名value。
6.1 定義自定義注解
import java.lang.annotation.*;
@Inherited
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Table {
String value();
}
import java.lang.annotation.*;
@Inherited
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
String columnName();
String columnType();
}
6.2 使用自定義注解
@Table("t_stu")
public class Student {
@Column(columnName = "sid",columnType = "int")
private int id;
@Column(columnName = "sname",columnType = "varchar(20)")
private String name;
}
6.3 讀取和處理自定義注解
自定義注解必須配上注解的信息處理流程才有意義。文章來源:http://www.zghlxwxcb.cn/news/detail-415321.html
自己定義的注解,只能使用反射的代碼讀取。所以自定義注解的聲明周期必須是RetentionPolicy.RUNTIME
。文章來源地址http://www.zghlxwxcb.cn/news/detail-415321.html
到了這里,關(guān)于Java中的注解,自定義注解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!