本文目錄一覽:
java開發中常用的註解有哪些
Java 註解全面解析,學習java做一個java工程師不但待遇高,而且前途無可限量。為什麼這樣說呢?因為java程序語言作為最流行的計算機開發語言之一,幾乎所有的系統、軟件、app、網頁等都是需要用到java的。
1.基本語法
註解定義看起來很像接口的定義。事實上,與其他任何接口一樣,註解也將會編譯成class文件。
@Target(ElementType.Method)
@Retention(RetentionPolicy.RUNTIME)
public @interface Test {}
除了@符號以外,@Test的定義很像一個空的接口。定義註解時,需要一些元註解(meta-annotation),如@Target和@Retention
@Target用來定義註解將應用於什麼地方(如一個方法或者一個域)
@Retention用來定義註解在哪一個級別可用,在源代碼中(source),類文件中(class)或者運行時(runtime)
在註解中,一般都會包含一些元素以表示某些值。當分析處理註解時,程序可以利用這些值。沒有元素的註解稱為標記註解(marker annotation)
四種元註解,元註解專職負責註解其他的註解,所以這四種註解的Target值都是ElementType.ANNOTATION_TYPE
註解 說明
@Target 表示該註解可以用在什麼地方,由ElementType枚舉定義
CONSTRUCTOR:構造器的聲明
FIELD:域聲明(包括enum實例)
LOCAL_VARIABLE:局部變量聲明
METHOD:方法聲明
PACKAGE:包聲明
PARAMETER:參數聲明
TYPE:類、接口(包括註解類型)或enum聲明
ANNOTATION_TYPE:註解聲明(應用於另一個註解上)
TYPE_PARAMETER:類型參數聲明(1.8新加入)
TYPE_USE:類型使用聲明(1.8新加入)
PS:當註解未指定Target值時,此註解可以使用任何元素之上,就是上面的類型
@Retention 表示需要在什麼級別保存該註解信息,由RetentionPolicy枚舉定義
SOURCE:註解將被編譯器丟棄(該類型的註解信息只會保留在源碼里,源碼經過編譯後,註解信息會被丟棄,不會保留在編譯好的class文件里)
CLASS:註解在class文件中可用,但會被VM丟棄(該類型的註解信息會保留在源碼里和class文件里,在執行的時候,不會加載到虛擬機(JVM)中)
RUNTIME:VM將在運行期也保留註解信息,因此可以通過反射機制讀取註解的信息(源碼、class文件和執行的時候都有註解的信息)
PS:當註解未定義Retention值時,默認值是CLASS
@Documented 表示註解會被包含在javaapi文檔中
@Inherited 允許子類繼承父類的註解
2. 註解元素
– 註解元素可用的類型如下:
– 所有基本類型(int,float,boolean,byte,double,char,long,short)
– String
– Class
– enum
– Annotation
– 以上類型的數組
如果使用了其他類型,那編譯器就會報錯。也不允許使用任何包裝類型。註解也可以作為元素的類型,也就是註解可以嵌套。
元素的修飾符,只能用public或default。
– 默認值限制
編譯器對元素的默認值有些過分挑剔。首先,元素不能有不確定的值。也就是說,元素必須要麼具有默認值,要麼在使用註解時提供元素的值。
其次,對於非基本類型的元素,無論是在源代碼中聲明,還是在註解接口中定義默認值,都不能以null作為值。這就是限制,這就造成處理器很難表現一個元素的存在或缺失狀態,因為每個註解的聲明中,所有的元素都存在,並且都具有相應的值。為了繞開這個限制,只能定義一些特殊的值,例如空字符串或負數,表示某個元素不存在。
@Target(ElementType.Method)
@Retention(RetentionPolicy.RUNTIME)
public @interface MockNull {
public int id() default -1;
public String description() default “”;
}
3. 快捷方式
何為快捷方式呢?先來看下springMVC中的Controller註解
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {
String value() default “”;
}
可以看見Target應用於類、接口、註解和枚舉上,Retention策略為RUNTIME運行時期,有一個String類型的value元素。平常使用的時候基本都是這樣的:
@Controller(“/your/path”)
public class MockController { }
這就是快捷方式,省略了名-值對的這種語法。下面給出詳細解釋:
註解中定義了名為value的元素,並且在應用該註解的時候,如果該元素是唯一需要賦值的一個元素,那麼此時無需使用名-值對的這種語法,而只需在括號內給出value元素所需的值即可。這可以應用於任何合法類型的元素,當然了,這限制了元素名必須為value。
4. JDK1.8註解增強
TYPE_PARAMETER和TYPE_USE
在JDK1.8中ElementType多了兩個枚舉成員,TYPE_PARAMETER和TYPE_USE,他們都是用來限定哪個類型可以進行註解。舉例來說,如果想要對泛型的類型參數進行註解:
public class AnnotationTypeParameter@TestTypeParam T {}
那麼,在定義@TestTypeParam時,必須在@Target設置ElementType.TYPE_PARAMETER,表示這個註解可以用來標註類型參數。例如:
@Target(ElementType.TYPE_PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface TestTypeParam {}
ElementType.TYPE_USE用於標註各種類型,因此上面的例子也可以將TYPE_PARAMETER改為TYPE_USE,一個註解被設置為TYPE_USE,只要是類型名稱,都可以進行註解。例如有如下注解定義:
@Target(ElementType.TYPE_USE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Test {}
那麼以下的使用註解都是可以的:
List@Test Comparable list1 = new ArrayList();
List? extends Comparable list2 = new ArrayList@Test Comparable();
@Test String text;
text = (@Test String)new Object();
java.util. @Test Scanner console;
console = new java.util.@Test Scanner(System.in);
PS:以上@Test註解都是在類型的右邊,要注意區分1.8之前的枚舉成員,例如:
@Test java.lang.String text;
在上面這個例子中,顯然是在進行text變量標註,所以還使用當前的@Target會編譯錯誤,應該加上ElementType.LOCAL_VARIABLE。
@Repeatable註解
@Repeatable註解是JDK1.8新加入的,從名字意思就可以大概猜出他的意思(可重複的)。可以在同一個位置重複相同的註解。舉例:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Filter {
String [] value();
}
如下進行註解使用:
@Filter({“/admin”,”/main”})
public class MainFilter { }
換一種風格:
@Filter(“/admin”)
@Filter(“/main”)
public class MainFilter {}
在JDK1.8還沒出現之前,沒有辦法到達這種“風格”,使用1.8,可以如下定義@Filter:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(Filters.class)
public @interface Filter {
String value();
}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Filters {
Filter [] value();
}
實際上這是編譯器的優化,使用@Repeatable時告訴編譯器,使用@Filters來作為收集重複註解的容器,而每個@Filter存儲各自指定的字符串值。
JDK1.8在AnnotatedElement接口新增了getDeclaredAnnotationsByType和getAnnotationsByType,在指定@Repeatable的註解時,會尋找重複註解的容器中。相對於,getDeclaredAnnotation和getAnnotation就不會處理@Repeatable註解。舉例如下:
@Filter(“/admin”)
@Filter(“/filter”)
public class FilterClass {
public static void main(String[] args) {
ClassFilterClass filterClassClass = FilterClass.class;
Filter[] annotationsByType = filterClassClass.getAnnotationsByType(Filter.class);
if (annotationsByType != null) {
for (Filter filter : annotationsByType) {
System.out.println(filter.value());
}
}
System.out.println(filterClassClass.getAnnotation(Filter.class));
}
}
日誌如下:
/admin
/filter
null
望採納!
java中常用註解分別是什麼及漢語意思!
Annotation(註解)是JDK5.0及以後版本引入的。它可以用於創建文檔,跟蹤代碼中的依賴性,甚至執行基本編譯時檢查。注釋是以‘@注釋名’在代碼中存在的,根據注釋參數的個數,我們可以將注釋分為:標記注釋、單值注釋、完整注釋三類。它們都不會直接影響到程序的語義,只是作為注釋(標識)存在,我們可以通過反射機制編程實現對這些元數據的訪問。另外,你可以在編譯時選擇代碼里的注釋是否只存在於源代碼級,或者它也能在class文件中出現。
元數據的作用
如果要對於元數據的作用進行分類,目前還沒有明確的定義,不過我們可以根據它所起的作用,大致可分為三類:
編寫文檔:通過代碼里標識的元數據生成文檔。
代碼分析:通過代碼里標識的元數據對代碼進行分析。
編譯檢查:通過代碼里標識的元數據讓編譯器能實現基本的編譯檢查。
基本內置註解
@Override java中覆寫
@Deprecated的作用是對不應該在使用的方法添加註釋,當編程人員使用這些方法時,將會在編譯時顯示提示信息,它與javadoc里的
@deprecated標記有相同的功能,準確的說,它還不如javadoc
@deprecated,因為它不支持參數
@SuppressWarnings,其參數有:
deprecation,使用了過時的類或方法時的警告
unchecked,執行了未檢查的轉換時的警告
fallthrough,當 Switch 程序塊直接通往下一種情況而沒有 Break 時的警告
path,在類路徑、源文件路徑等中有不存在的路徑時的警告
serial,當在可序列化的類上缺少 serialVersionUID 定義時的警告
finally ,任何 finally 子句不能正常完成時的警告
all,關於以上所有情況的警告
自定義注釋
它類似於新創建一個接口類文件,但為了區分,我們需要將它聲明為@interface,如:public @interface NewAnnotation {}…………
java 線程方面的幾個註解
1.方法一:在初始化時保存ApplicationContext對象
代碼:
ApplicationContext ac = new FileSystemXmlApplicationContext(“applicationContext.xml”);
ac.getBean(“beanId”);
說明:這種方式適用於採用Spring框架的獨立應用程序,需要程序通過配置文件手工初始化Spring的情況。
2.方法二:通過Spring提供的工具類獲取ApplicationContext對象
代碼:
import org.springframework.web.context.support.WebApplicationContextUtils;
ApplicationContext ac1 = WebApplicationContextUtils.getRequiredWebApplicationContext(ServletContext sc);
ApplicationContext ac2 = WebApplicationContextUtils.getWebApplicationContext(ServletContext sc);
ac1.getBean(“beanId”);
ac2.getBean(“beanId”);
說明:
這種方式適合於採用Spring框架的B/S系統,通過ServletContext對象獲取ApplicationContext對象,然後在通過它獲取需要的類實例。
上面兩個工具方式的區別是,前者在獲取失敗時拋出異常,後者返回null。
其中 servletContext sc 可以具體 換成 servlet.getServletContext()或者 this.getServletContext() 或者 request.getSession().getServletContext(); 另外,由於spring是注入的對象放在ServletContext中的,所以可以直接在ServletContext取出 WebApplicationContext 對象: WebApplicationContext webApplicationContext = (WebApplicationContext) servletContext.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
3.方法三:繼承自抽象類ApplicationObjectSupport
說明:抽象類ApplicationObjectSupport提供getApplicationContext()方法,可以方便的獲取到ApplicationContext。
Spring初始化時,會通過該抽象類的setApplicationContext(ApplicationContext context)方法將ApplicationContext 對象注入。
4.方法四:繼承自抽象類WebApplicationObjectSupport
說明:類似上面方法,調用getWebApplicationContext()獲取WebApplicationContext
5.方法五:實現接口ApplicationContextAware
說明:實現該接口的setApplicationContext(ApplicationContext context)方法,並保存ApplicationContext 對象。
Spring初始化時,會通過該方法將ApplicationContext對象注入。
java 中的幾種注釋方式
我看動力節點的java基礎大全301集教中的三種注釋方法:
1、單行注釋 //注釋的內容
2、多行注釋 /*……*/
3、/**……*/,這種方式和第二種方式相似。這種格式是為了便於javadoc程序自動生成文檔。
下面介紹一下Javadoc的標記:
特別聲明:
(1)javadoc針對public類生成注釋文檔
(2)javadoc只能在public、protected修飾的方法或者屬性之上
(3)javadoc注釋的格式化:前導*號和HTML標籤
(4)javadoc注釋要僅靠在類、屬性、方法之前
下面主要舉例說明第三種注釋的應用:
(1)首先編寫.java文件
(2)在命令行中執行以下dos命令:
javadoc *.java //根據相應的Java源代碼及其說明語句生成HTML文檔
//javadoc標記:是@開頭的,對javadoc而言,特殊的標記。
(3)在當前目錄下就會產生doc文件夾,裡面有一系列的.html文件
附上代碼:
[java] view plain copy
span style=”font-size:18px;”*/
/**javadoc注釋的內容
*/
public class Hello{
/**屬性上的注釋*/
public String name;
/**這是main方法,是程序的入口
*@param args 用戶輸入參數
*/
public static void main(String[] args){
System.out.println(“Hello World!”);
f1();
}
/** 這是第1個方法,其作用是…*/
public static void f1(){
System.out.println(“f1()!”);
}
}/span
[java] view plain copy
span style=”font-size:18px;”import java.io.IOException;
/**javadoc注釋內容
*@since 1.0
*@version 1.1
*@author Blue Jey
*br鏈接到另一個文檔{@link Hello},就這些
*see Hello
*/
public class HelloWorld{
/**非public,protected 屬性上的注釋不生成*/
public String name;
/**這是main方法,是程序的入口
*@param args 用戶輸入的參數,是數組
*@throws IOException main方法io異常
*/
public static void main(String args[]) throws IOException{
System.out.println(“hello World!”);
f1();
f2(1);
}
/**這是第一個方法,其作用是….
*@deprecated 從版本1.2開始,不再建議使用此方法
*/
public static void f1(){
System.out.println(“fl()!”);
}
/**這是第二個方法,其作用是….
*@return 返回是否OK
*@param i 輸入參數i
*@see Hello
*@throws IOException io異常
*/
public static String f2(int i)throws IOException{
System.out.println(“f1()!”);
return “OK”;
}
} /span
注意:
如果源文件中有用到@version,@author標記,則在執行javadoc命令時,要加-version -author
javadoc -version -author -d doc *.java
(其中用-version用於提取源文件中的版本信息 -author用於提取源文件中的作者信息)
java中的注釋可分為三種類型
Java中三種類型的注釋:
單行注釋:// 注釋內容
多行注釋:/*… 注釋內容….*/
文本注釋:/**.. 注釋內容….*/
代碼注釋是架起程序設計者與程序閱讀者之間的通信橋樑,最大限度的提高團隊開發合作效率。也是程序代碼可維護性的重要環節之一。所以不是為寫注釋而寫注釋。
備註:簡單的代碼做簡單注釋,注釋內容不大於10個字即可,另外,持久化對象或VO對象的getter、setter方法不需加註釋。
擴展資料:
類(模塊)注釋採用 /** …… */,在每個類(模塊)的頭部要有必要的注釋信息,包括:工程名;類(模塊)編號;命名空間;類可以運行的JDK版本;版本號;作者;創建時間;類(模塊)功能描述(如功能、主要算法、內部各部分之間的關係、該類與其類的關係等,必要時還要有一些如特別的軟硬件要求等說明);主要函數或過程清單及本類(模塊)歷史修改記錄等。
參考資料來源:百度百科-java注釋
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/306422.html