注解(annotation)
最近項目中看到很多注解嘁圈,一臉懵逼省骂,注解什么東西,于是網(wǎng)上各種搜索折騰最住,網(wǎng)上找到的答案千篇一律钞澳,能講明白的真的很少,看的也是迷迷糊糊涨缚,大概知道注解是和反射要搭配起來使用轧粟,如果只是單純?nèi)タ醋⒔飧杏X很迷惑,自定義注解脓魏,然后可以放在類兰吟,接口,方法茂翔,屬性混蔼,枚舉中,可以填充注解中所需的參數(shù)珊燎,到底有什么用拄丰?注解到底干了什么?老子還是云里霧里的俐末,不知所云料按。
注解字面去理解就是對指定對象(類,方法卓箫,接口...)等等的一個說明载矿。
注解的創(chuàng)建末班:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface Other {
String value() default "";
int age();
String[] names();
annotaiton();
......
}
@Target:用于指定注解的作用域,那些對象可以使用該注解烹卒,例如ElementType.TYPE闷盔,指明注解可以應(yīng)用到類,接口旅急,枚舉逢勾。
ElementType.METHOD ,指明注解可以應(yīng)用到方法中藐吮。
ElementType.FIELD溺拱,指明注解可以應(yīng)用到屬性中逃贝。
/** Class, interface (including annotation type), or enum declaration */
TYPE,
/** Field declaration (includes enum constants) */
FIELD,
/** Method declaration */
METHOD,
/** Formal parameter declaration */
PARAMETER,
/** Constructor declaration */
CONSTRUCTOR,
/** Local variable declaration */
LOCAL_VARIABLE,
/** Annotation type declaration */
ANNOTATION_TYPE,
/** Package declaration */
PACKAGE,
/**
* Type parameter declaration
*
* @since 1.8
*/
TYPE_PARAMETER,
/**
* Use of a type
*
* @since 1.8
*/
TYPE_USE
@Retention: 用于指定注解的聲明周期。
RetentionPolicy.SOURCE 指明注解編譯前生效迫摔。
RetentionPolicy.CLASS 指明注解可以編譯在class類中沐扳。
RetentionPolicy.RUNTIME 指明注解可以程序運行時生效。
/**
* Annotations are to be discarded by the compiler.
*/
SOURCE,
/**
* Annotations are to be recorded in the class file by the compiler
* but need not be retained by the VM at run time. This is the default
* behavior.
*/
CLASS,
/**
* Annotations are to be recorded in the class file by the compiler and
* retained by the VM at run time, so they may be read reflectively.
*
* @see java.lang.reflect.AnnotatedElement
*/
RUNTIME
@Documented:指明該對象可以生存和API文檔句占。
@Inherited: 該注解表明子類是有繼承了父類的注解沪摄。比如一個注解被該元注解修飾,并且該注解的作用在父類上纱烘,那么子類有持有該注解杨拐。如果注解沒有被該元注解修飾,則子類不持有父類的注解擂啥。
看到這里是不是還是一臉的懵逼戏阅,這是弄啥嘞。
這是我在網(wǎng)上找的一個例子啤它,通過模擬Mybatis自動生成sql語句的例子奕筐,等看完這個例子獲取你大概知道注解到底干了個啥。
按照作者的給的例子变骡,完成了整個代碼离赫,運行OK,回過頭再看下例子塌碌,大概有點豁然開朗渊胸。
總結(jié)下:單純的注解是毫無意義的存在,必須配合反射技術(shù)的使用台妆,才能凸顯其價值翎猛,注解類似于一個無形的軟橋,他會將被他注解的類中帶的信息傳遞到一個指定的類中接剩,通過反射技術(shù)獲取到該類的信息切厘,然后在做一些見不得人的的事情。