標籤:
前言
在剛學java web開發的時候,我第一次看到註解不是在java裡,而是在spring裡,於是很長一段時間裡,我都認為註解是spring特有的技術,後來用到mybatis的時候,發現也有不少註解,再加上經常在java中看到的@Override之類的,才懷疑註解是不是java的東西。可是懷疑歸懷疑,但是開發都快一年多了,從來沒有想過去瞭解註解這個東西,更別說開發自己的註解了。
Java註解介紹
近來,項目中有許多額外的xml檔案,我一直認為這是非常不好的,聯想到spring可以將applicationContext.xml中的東西用註解寫進類中,於是在想是不是也可以試試開發自己的註解。
首先,來看java裡面的annotation包。
從IDE的標誌就可以看出來,有四個註解隱藏在其中,這四個註解正是java的元註解,也就是”註解的註解“。它們依次是:
1.Document:沒有參數,就是表明將這個註解包含在javadoc中
2.Inherited:沒有參數,表明可以被繼承
3.Retention:有參數(可選項就在下一個RerentionPolicy中),表明該註解可以被什麼層級儲存
1.Source:源碼層級,也就是說這個註解就是給編譯器看看的,看完就扔了,不會被編譯,也就是在.class檔案中是找不到的,比如@Override
2.Class:能在class檔案中找到,但是在VM運行時是找不到的。這個是預設層級。
3.Runtime:在VM運行時都能保留,因此可以通過java反射機制來讀取註解資訊,一般來說這個用的最多。比如:@Value、@Controller、@Bean
4.Target:有參數(可選項在ElementType中),表明該註解可以被放在類的哪個層面上,預設是全部。
有了這幾個,就已經可以開發自己的註解了,試一下:
@Retention(RetentionPolicy.RUNTIME)public @interface Info { String book() default "";}public class Book { @Info(book = "Thinking in java") String bookName; public String getName(){ return bookName; } public static void main(String[] args) { Field[] fields = Book.class.getDeclaredFields(); for (Field field : fields){ if(field.isAnnotationPresent(Info.class)){ Info info = field.getAnnotation(Info.class); Book book = new Book(); book.bookName = info.book(); System.out.println(book.getName()); } } }}
簡單到爆,當然稍微需要有點java的反射基礎知識。一般我們用spring,mybatis之類的架構註解時,不用寫這些解析反射的代碼,是因為架構幫我們做好了。
<Java> java註解介紹