摘要:那到底是怎么定義的呢它還能用在什么地方是如何在編譯的時候遇到這個注解就馬上發出一個提示的呢帶著這些疑問,一步一步學習的注解。
最近在學習Spring Boot,發現真的是一個靠注解搭起來的框架,Spring從使用XML到現在使用注解,大概是終于發現絕大多數人所寫的項目,都不需要XML的松耦合,快速上線、快速丟棄、快速接手,在一切都要求快的互聯網公司里,XML這樣的松耦合浪費太多的學習成本了,劃不來。
之前一直沒有系統學習過Java的注解,學習起Spring Boot來總是用得不明所以,想想還是從基礎學起,方不至于浪費大量的時間去查找Spring Boot各個注解的使用文檔。
Java的注解,實際上包含三方面的內容,一個是Java注解本身的定義,一個是Java注解的使用,一個是如何利用Java的反射功能實現功效。本文也將從這三個方面逐一講解,主要參考文章JAVA 注解的基本原理 和 Java語法標準。
Java 內置了許多的注解,在Java Annotation可以找到內置的所有注解,我們最常見的注解應該是@Deprecated,一旦一個方法使用了這個注解,別人此后再使用這個方法時,就會提示這個方法已經被廢棄了,建議不再使用。
那@Deprecated到底是怎么定義的呢?它還能用在什么地方?JDK是如何在編譯的時候遇到這個注解就馬上發出一個提示的呢?帶著這些疑問,一步一步學習Java的注解。
一、如何創建一個注解
所有的注解本身都繼承于java.lang.annotation.Annotation, 每一個注解本身就是一個interface,但是注解這種interface有其特殊性,所以,所有的注解都是這樣定義的:
publice @interface xxxx {}
@Deprecated的實現代碼如下:
import java.lang.annotation.*; import static java.lang.annotation.ElementType.*; @Documented @Retention(RetentionPolicy.RUNTIME) @Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE}) public @interface Deprecated { }
多了@Documented, @Retention,@Target三個注解,這三個注解分別是什么呢?又有什么作用呢?
用于方法的方法,叫做元方法,所以用于注解的注解,就叫做元注解,這三個都是JDK提供的元注解。
@Documented標記這個注解@Deprecated將會出現在Java Doc之中
@Rentention標明這個注解的生命周期,RententionPolicy里面定義了三種生命周期,分別是SOURCE,CLASS,RUNTIME三種,SOURCE表示在編譯階段拋棄,CLASS表示會被記錄到class文件里面,但不會出現在vm里面運行,RUNTIME表示在運行期里面存活。
@Target表示這個注解可以用在何處,比如@Deprecated的定義,表明它可以用在構造函數,字段,本地變量,方法,包,參數,類
@Deprecated public class TestDeprecated { @Deprecated public String name; @Deprecated public TestDeprecated(String name){ } @Deprecated public String getName() { return name; } public void testDeprecatedParam(@Deprecated String name, String sex){ @Deprecated String test = "test"; System.out.println(name + sex + test); } }
如上是@Deprecated在類、字段、構造函數、方法、參數和本地變量的使用方式。不過本地變量和參數的@Deprecated似乎是不起作用的。另外,package級別的注解使用,需要使用package-info.java, 比如package-info.java文件如下:
@Deprecated
package com.shahuwang;
這樣子就標記了整個包都是要廢棄的了。
目前Java 10 提供了 @Documented, @Inherited,@Native,@Repeatable,@Retention, @Target 共六個元注解,除了上面已講解過的三個,剩余三個的用途:
@Inherited 表示使用了它的注解,再用到類上面時,可被子類繼承此注解。
@Inherited publice @interface Test{} @Test public class Parent{} public class Child extends Parent{}
如上,Child類也繼承了@Test 這個注解,可以使用它的功能。
@Native 表示定義常量值的字段可以被native代碼引用,當native代碼和java代碼都需要維護相同的常量時,如果java代碼使用了@Native標志常量字段,可以通過工具將它生成native代碼的頭文件。目前對Java的native代碼研究比較少,后面再對它進行研究
@Repeatable 表示注解可以重復使用,是Java 8引進的特性。之前注解只能在同一個地方用一次,用了@Repeatable,注解就可以在同一個地方使用多次了,可以參考這篇文章https://blog.csdn.net/aitangy...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/75716.html
摘要:注解提供了一種安全的類似注釋的機制,用來將任何的信息或元數據與程序元素類方法成員變量等進行關聯。為程序的元素類方法成員變量加上更直觀更明了的說明,這些說明與程序的業務邏輯無關,并且提供給指定的工具或框架使用。 什么是注解? Annotation 是 Java5 之后開始引入的新特性,中文為注解。注解提供了一種安全的類似注釋的機制,用來將任何的信息或元數據(metadata)與程序元素(...
摘要:定義注解,也叫元數據。它可以聲明在包類字段方法局部變量方法參數等的前面,用來對這些元素進行說明,注釋。方法返回該程序元素上存在的所有注解。與此接口中的其他方法不同,該方法將忽略繼承的注釋。 定義: 注解(Annotation),也叫元數據。一種代碼級別的說明。它是JDK5.0及以后版本引入的一個特性,與類、接口、枚舉是在同一個層次。 它可以聲明在包、類、字段、方法、局部變量、方法參數等...
摘要:注解有以下幾個知識點元數據注解的分類內置注解自定義注解注解處理器本文先介紹前面個知識點元數據注解的分類內置注解自定義注解。注解相當于是一種嵌入在程序中的元數據,可以使用注解解析工具或編譯器對其進行解析,也可以指定注解在編譯期或運行期有效。 大家好,我是樂字節的小樂,上次說過了Java多態的6大特性|樂字節,接下來我們來看看Java編程里的注解。showImg(https://segme...
摘要:第章元編程與注解反射反射是在運行時獲取類的函數方法屬性父類接口注解元數據泛型信息等類的內部信息的機制。本章介紹中的注解與反射編程的相關內容。元編程本質上是一種對源代碼本身進行高層次抽象的編碼技術。反射是促進元編程的一種很有價值的語言特性。 第12章 元編程與注解、反射 反射(Reflection)是在運行時獲取類的函數(方法)、屬性、父類、接口、注解元數據、泛型信息等類的內部信息的機...
摘要:不久前發現有一個第三方庫可以在一定程度上幫助我們從體力勞動中解救出來,它就是。來看自動生成的方法中對于數組采用的是。檢查傳入對象是否為,若為,則拋出異常。比如自動拋受檢異常,而無需顯式在方法上使用語句。 前言 Laziness is a virtue!每當寫pojo類時,都會重復寫一些setter/getter/toString方法等大量的模版代碼,無聊繁瑣卻又不得不做,這會讓這個類變...
閱讀 3022·2021-11-18 10:07
閱讀 3765·2021-11-17 17:00
閱讀 2103·2021-11-15 18:01
閱讀 926·2021-10-11 10:58
閱讀 3373·2021-09-10 10:50
閱讀 3442·2021-08-13 15:05
閱讀 1229·2019-08-30 15:53
閱讀 2640·2019-08-29 13:01