詳解java1.5新添特性------註解java
在求職面試過程當中,被問到是否本身用過java註解以及本身實現過一個註解,當時就懵逼了,what's the f**k!
面試
將來的開發模式都是基於註解的,JPA是基於註解的,Spring2.5以上都是基於註解的,Hibernate3.x之後也是基於註解的,如今的Struts2有一部分也是基於註解的了,註解是一種趨勢數組
廢話不說直接實驗開動起來:註解就是一個特殊的類,註解向開發工具或者編譯器傳遞一種信息(官方的語言)ide
java中常見的註解工具
1. @Override,子類覆寫父類的方法;開發工具
2. @SuppressWarnings(「deprecation」),壓縮警告,忽略過期的警告;測試
3. @Deprecated,方法過期;spa
package com.banyoukang.annotation;orm
public class Test1 {對象
public static void testSuppressWarn(){
System.runFinalizersOnExit(true);
}
@SuppressWarnings("deprecation")
public static void testSuppressWarn2(){
System.runFinalizersOnExit(true);
}
@Override
public String toString(){
return "banyoukang";
}
@Deprecated
public static String testDeprecated(){
return "此註解說明這個方法已經廢棄,或者過期了!";
}
public static void main(String[] args){
testDeprecated();//這裏使用testDeprecated方法就會顯示這個方法已通過時
}
/*
* testSuppressWarn()方法和testSuppressWarn2()對比就能夠發現,沒有註解@SuppressWarnings("deprecation")
* 的方法中使用了java過期的runFinalizersOnExit(boolean)方法,編譯器會產生警告信息,而添加了註解的方法編譯器則 *沒有警告信息產生(便是註解的做用所在)
*/
}
經過上面的例子能夠大體的看到註解的做用所在,接下來咱們本身實現一個註解,並提取相應的信息:
註解類:
package com.banyoukang.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.METHOD,ElementType.TYPE})
/*
* Retention註解決定MyAnnotation註解的生命週期
1.RetentionPolicy.SOURCE —— 這種類型的Annotations只在源代碼級別保留,編譯時就會被忽略
2.RetentionPolicy.CLASS —— 這種類型的Annotations編譯時被保留,在class文件中存在,但JVM將會忽略
3.RetentionPolicy.RUNTIME —— 這種類型的Annotations將被JVM保留,因此他們能在運行時被JVM或其餘使用反射機制的代碼所讀取和使用.
*/
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
//定義註解的屬性
String name();
int age();
boolean gender();
//boolean gender() default true;這裏能夠爲屬性指定默認值,若是不指定的話,必定要傳入
//若是一個註解中有一個名稱爲value的屬性,且你只想設置value屬性(即其餘屬性都採用默認值或者你只有一個value屬性),那麼能夠省略掉「value=」部分。
//String value();
//這裏也能夠定義高級屬性,好比數組和枚舉類型
}
測試類:
package com.banyoukang.annotation;
@MyAnnotation(name="班友康",age=20,gender=true)
public class MyAnnotationTest {
public static void main(String[] args) {
//經過反射得到註解對應的實例對象,而後調用屬性
MyAnnotation annotation = MyAnnotationTest.class.getAnnotation(MyAnnotation.class);
if(annotation.gender()){
System.out.println("姓名:"+annotation.name()+",年齡:"+annotation.age()+",性別:男");
}else{
System.out.println("姓名:"+annotation.name()+",年齡:"+annotation.age()+",性別:女");
}
}
}
能夠看到註解更像是一種特殊的接口,註解的屬性定義方式就和接口中定義方法的方式同樣,而應用了註解的類能夠認爲是實現了這個特殊的接口
注:建議將代碼複製過去本身運行一次看看,會對註解有比較好的認識。