package com.franky.annotation;
/**
* @描述 註解的應用實例
* @作者 franky
* @日期 2014-12-31 下午3:16:00
*/
//顯式指定註解值,如果數組屬性只有一個元素那麼可以省略大括號
@MyAnnotation(color = "red",value = "hello",arrValue=1,metaAnnotation=@MetaAnnotation("world"))
public class AnnotationTest {
/**
* 每一個註解都是一個對象,java.lang包下的三個基本註解:
* @Override 方法覆蓋註解
* @SuppressWarnings 取消對方法的顯示警告
* @deprecated 方法過時註解
*
*/
//給value()方法直接賦值,而color()方法已經有默認值
@MyAnnotation("hello")
public static void main(String[] args) {
//調用過時方法
show();
//調用取消警告的方法
suppressWarnings();
//檢查是否帶有註解類
boolean isAnnotation = AnnotationTest.class.isAnnotationPresent(MyAnnotation.class);
//如果帶有註解,那麼獲取註解對象
if(isAnnotation){
MyAnnotation myAnnotation = AnnotationTest.class.getAnnotation(MyAnnotation.class);
System.out.println(myAnnotation);
//可以打印註解的屬性值
System.out.println(myAnnotation.color());
System.out.println(myAnnotation.arrValue().length);
System.out.println(myAnnotation.enumAttr().nextNum().name());
System.out.println(myAnnotation.metaAnnotation().value());
}
}
//註明方法爲過時方法
@Deprecated
public static void show(){
System.out.println("hello,world");
}
//過時方法註解,編譯器可以通過編譯
@SuppressWarnings("deprecation")
public static void suppressWarnings(){
System.runFinalizersOnExit(true);
}
}
自定義註解類MyAnnotation:
package com.franky.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
*
* @描述 自定義的註解類
* @作者 franky
* @日期 2014-12-31 下午3:42:15
*/
/**
* 自定義註解需要加入元註解(枚舉值),那麼編譯器在編譯時不會去掉註解
* RetentionPolicy.SOURCE 保留在原文件
* RetentionPolicy.CLASS 保留在class文件
* RetentionPolicy.RUNTIME 保留到運行時
*
* ElementType.METHOD 說明自定義的註解可應用在方法上
* ElementType.TYPE 說明自定義的註解可應用的類型上
* ElementType的各種枚舉值說明了註解可以加在哪些類型上
*
* 註解的屬性類型包括8種基本屬性類型,String,Class,枚舉類型,
* 或者上面這些類型的數組
*
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.TYPE})
public @interface MyAnnotation {
//屬性的默認值
String color() default "blue";
//如果只有一個value方法需要賦值,那麼可以直接進行賦值
String value();
//數組屬性
int[] arrValue() default {1,2,3};
//枚舉屬性
EnumAttr enumAttr() default EnumAttr.ONE;
//註解屬性
MetaAnnotation metaAnnotation() default @MetaAnnotation("metaAnnotation");
}
自定義的註解MetaAnnotation:
package com.franky.annotation;
/**
* @描述 自定義的註解
* @作者 franky
* @日期 2014-12-31 下午5:08:02
*/
public @interface MetaAnnotation {
String value() default "ok";
}
package com.franky.annotation;
/**
* @描述 使用的枚舉類
* @作者 franky
* @日期 2014-12-31 下午5:09:15
*/
public enum EnumAttr {
ONE {
@Override
public EnumAttr nextNum() {
return TWO;
}
},
TWO {
@Override
public EnumAttr nextNum() {
return THREE;
}
},
THREE {
@Override
public EnumAttr nextNum() {
return ONE;
}
};
public abstract EnumAttr nextNum();
}