Java 注解
Java Annotations
什么是java注解
Java注解不屬于代碼的一部分,但用來給代碼添加元數(shù)據(jù)(metadata). Java注解并不會直接對其所注解的代碼運(yùn)行產(chǎn)生操作.
作用
編譯器說明
Java有三個(gè)內(nèi)建注解,分別是@Deprecated @Override 和 @SuppressWarnings. 他們可以給編譯器確認(rèn)指令.例如@override注解告訴編譯器被注解的方法被覆蓋.
編譯期指令:注解可以為編譯器提供編譯期指令.他們還可以被軟件構(gòu)建工具用于生成代碼,XML文件等
執(zhí)行期指令: 這種注解可以在代碼運(yùn)行期通過Java反射機(jī)制操作程序運(yùn)行.
注解基礎(chǔ)
注解以@開始,后面跟著注解的名字,字符@告訴編譯器這是一個(gè)注解.
例如
@Overrite
@表明這是一個(gè)注解,Overrite是這個(gè)注解的名字.
哪里可以使用注解
注解可以應(yīng)用于類,接口,方法和屬性.例如下面是為方法添加注解
@Override
void myAnnotationsMethod(){
//Do someting here
}
Java內(nèi)建注解
Java有三個(gè)內(nèi)建注解:
- @Override
- @Deprecated
- @SuppressWarnings
- @override注解
@override注解被用于在子類中覆蓋父類的方法.這有助于增加代碼的可讀性,降低代碼維護(hù)難度.例如,當(dāng)改變父類方法的簽名后,子類中沒有
做同步的函數(shù)簽名修改的情況下
* 如果子類中的覆蓋方法使用了@override注解
編譯器將拋出編譯錯(cuò)誤.以便開發(fā)人員及時(shí)方便的發(fā)現(xiàn)問題
* 如果子類中的覆蓋方法沒有使用該注解
編譯器在編譯時(shí)會認(rèn)為這個(gè)方法并不是覆蓋的父類方法而是子類新增的方法,從而編譯通過.而這并不是開發(fā)人員期望的結(jié)果.
例子
public class MyParentClass {
public void justaMethod() {
System.out.println("Parent class method");
}
}
public class MyChildClass extends MyParentClass {
@Override
public void justaMethod() {
System.out.println("Child class method");
}
}
- @Deprecated注解
表示被注解的元素不應(yīng)該
再被使用.例如
@Deprecated
public void oneDeprecatedMethod(){
//Do something here
}
- @SuppressWarnings
該注解告訴編譯器忽略被注解元素編譯時(shí)產(chǎn)生的警告信息.例如,當(dāng)使用一個(gè)被@Deprecated注解的方法時(shí),希望編譯器忽略deprected警告,則可以使用如下的方式
@SuppressWarnings("depracation")
pulic void myNoWarningsMethod(){
myObject.oneDeprecatedMethod();
}
創(chuàng)建自定義注解
示例:
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Documented
@Target(Element.METHOD)
@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface MyCustomAnnotation{
int age() default 18;
String name();
String author() default "LeoSun";
String[] friendList();
public enum Sex{
MALE,FEMALE
}
Sex sex() default Sex.MALE;
}
- 注解創(chuàng)建時(shí)使用
@interface annotationName
其中annotationName為自定義注解的名字. - 自定義注解使用
元注解
(meta-annotation)進(jìn)行注解 - 注解可以有元素,元素的形式類似于方法.但沒有方法的實(shí)現(xiàn)部分.
- 所有注解extends
java.lang.annotation
接口,不能extends其他. - 包含默認(rèn)值的元素,例如上例中的age,author等,在使用時(shí)可不賦值.例如
@MyCustomAnnotation(
name="LeoSun",
friendList="{"lili","xiaoming"}"
)
public classs myClass{
//...
}
下面介紹自定義注解中使用到的四個(gè)元注解
- @Documentd
在生成javadoc文檔時(shí),該注解會被生成到文檔中. - @Target
指定該注解可被使用的位置.MyCustomAnnotation注解只能被使用在方法上.Target可使用的位置為
//注解方法
ElementType.METHOD
//注解包
ElementType.PACKAGE
//注解參數(shù)
ElementType.PARAMETER
//類,接口(包括注解)或枚舉
ElementType.TYPE
ElementType.ANNOTATION_TYPE
//注解構(gòu)造函數(shù)
ElementType.CONSTRUCTOR
//注解局部變量
ElementType.LOCAL_VARIABLE
//注解屬性
ElementType.FIELD
如果注解沒有使用@Target,則表明該注解可以使用在任何元素上.
- @Inherited
表明被該注解所注解的類的所有子類都會繼承該注解.例如
@MyCustomAnnotation
public class MyParentClass {
...
}
public class MyChildClass extends MyParentClass {
...
}
這里,MyParentClass使用了MyCustomAnnotation, MyChhildClass是MyParentClass的子類,因此,MyChhildClass也具有MyCustomAnnotation注解.
- @Retention
表明被注解元素的生存期.有三種類型
//運(yùn)行期有效,可被Java反射使用
RetentionPolicy.RUNTIME
//生成在.class文件中,程序運(yùn)行期不可用
RetentionPolicy.CLASS
//被注解的元素在源代碼文件中,既不會生成到class文件,在運(yùn)行期也不可用
RetentionPolicy.SOURCE
注解創(chuàng)建完成,下一篇講述如何處理自定義的注解.