之前在開發中,就總納悶,為什么繼承接口時,會出現@Override注解,有時候還會提示寫注解@SuppressWarnings?
原來這是java特有的特性,注解!
那么什么是注解呢?
注解就是某種注解類型的一個實例,我們可以用它在某個類上進行標注,這樣編譯器在編譯我們的文件時,會根據我們自己設定的方法來編譯類。
注解都是什么呢?看下面這張圖就明白了!
上面的圖可以看出,注解大體上分為三種:標記注解,一般注解,元注解
@Override用於標識,該方法是繼承自超類的。這樣,當超類的方法修改后,實現類就可以直接看到了。
而@Deprecated注解,則是標識當前方法或者類已經不推薦使用,如果用戶還是要使用,會生成編譯的警告。
上面的測試,也僅僅是針對IDE,如果是利用javac,應該會有提示的。
其他的不多說了,標准元注解 都是干嘛的呢?
@Documented 標記生成javadoc
@Inherited 標記繼承關系
@Retention 注解的生存期
@Target 標注的目標
下面我們自己做一個注解!
首先聲明一個接口,並未它添加注解內容!
1 package testAnnotation; 2 3 import java.lang.annotation.Documented; 4 import java.lang.annotation.Retention; 5 import java.lang.annotation.RetentionPolicy; 6 7 @Documented 8 @Retention(RetentionPolicy.RUNTIME) 9 public @interface Person{ 10 String name(); 11 int age(); 12 }
一般來說,注解都是搭配反射的解析器共同工作的。然后利用反射機制查看類的注解內容
1 package testAnnotation; 2 3 @Person(name="xingoo",age=25) 4 public class test3 { 5 public static void print(Class c){ 6 System.out.println(c.getName()); 7 8 //java.lang.Class的getAnnotation方法,如果有注解,則返回注解。否則返回null 9 Person person = (Person)c.getAnnotation(Person.class); 10 11 if(person != null){ 12 System.out.println("name:"+person.name()+" age:"+person.age()); 13 }else{ 14 System.out.println("person unknown!"); 15 } 16 } 17 public static void main(String[] args){ 18 test3.print(test3.class); 19 } 20 }
運行結果,讀取到了注解的內容
testAnnotation.test3
name:xingoo age:25