Java annotation
以我的理解,Java的注解就是對代碼的注釋,但是與普通注釋不同的是集漾,這些注釋可以自定義規(guī)范竖幔,有些甚至可以在運(yùn)行時(shí)保留并通過反射獲取板乙。既然是注釋,那么無論保存時(shí)間有多長拳氢,對程序的運(yùn)行結(jié)果都沒有任何影響募逞。注釋存在的根本意義就是對代碼的說明解釋晓猛,諸如這段代碼要干嘛,這個(gè)類是做什么的之類凡辱。
根據(jù)以上理解戒职,可以總結(jié)出注解的幾種用途。首先是作為注釋存在的意義就是對程序的說明透乾,理所當(dāng)然可以根據(jù)注解生成一份產(chǎn)品說明文檔洪燥,以供后來者理解你的程序和代碼。其次是注解比注釋更進(jìn)步的一點(diǎn)是程序可以在運(yùn)行時(shí)通過反射獲取注解的內(nèi)容乳乌。那么我們完全可以把一部分需要在配置文件中定義的內(nèi)容放在注解里面實(shí)現(xiàn)捧韵。比如一個(gè)web項(xiàng)目,需要根據(jù)http請求的地址不同調(diào)用不同的servlet進(jìn)行響應(yīng)汉操,這樣一種<地址再来,servlet>的映射關(guān)系,完全可以通過在servlet類上添加注解來實(shí)現(xiàn)磷瘤。(但是注解無法完全取代配置文件芒篷,強(qiáng)行使用可能會自找麻煩)。第三種我是在網(wǎng)上看到的采缚,就是給編譯器一個(gè)信號针炉,例如@Override注解,編譯器檢查到這種注解扳抽,就會檢查該函數(shù)是否是重載的父類函數(shù)篡帕,如果不是就報(bào)錯(cuò)。
注解有幾個(gè)特性
- 注解不支持相互繼承贸呢。實(shí)際上所有的注解編譯之后都會實(shí)現(xiàn)Annotation接口
- 注解支持的數(shù)據(jù)類型只有String镰烧、基本數(shù)據(jù)類型、枚舉類型楞陷、類類型怔鳖、注解類型以及他們的數(shù)組。
ORM
Object Relational Mapping 對象關(guān)系映射猜谚。顧名思義就是數(shù)據(jù)庫表與類的映射關(guān)系败砂。最簡單的一種就是類對應(yīng)表,成員變量對應(yīng)列魏铅,一個(gè)對象對應(yīng)一行數(shù)據(jù)昌犹。這樣的形式完全可以用注解來實(shí)現(xiàn)。
例子
- 定義一個(gè)數(shù)據(jù)庫表的注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Table {
public String value() default "";
}
- 定義一個(gè)數(shù)據(jù)庫表列的注解
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
public String value() default "";
}
- 定義一個(gè)類览芳,加上注解斜姥,與之對應(yīng)的數(shù)據(jù)庫表
@Table("UserInfo")
public class User {
@Column("username")
public String userName;
@Column("password")
public String password;
@Column("age")
public int age;
}
- 獲取類對應(yīng)的表,以及成員變量對應(yīng)的列
boolean isTable = User.class.isAnnotationPresent(Table.class);
if (isTable) {
Table table = User.class.getAnnotation(Table.class);
System.out.println(User.class.getSimpleName() + ": " + table.value());
Field[] fields = User.class.getFields();
for (Field field : fields) {
boolean isCol = field.isAnnotationPresent(Column.class);
if (isCol) {
Column col = field.getAnnotation(Column.class);
System.out.println("\t" + field.getName() + ": " + col.value());
}
}
-
輸出結(jié)果