今天小編給大家分享一下Annotation注解怎么定義的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來(lái)了解一下吧。
成都創(chuàng)新互聯(lián)公司是一家專業(yè)提供謝家集企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、H5響應(yīng)式網(wǎng)站、小程序制作等業(yè)務(wù)。10年已為謝家集眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)絡(luò)公司優(yōu)惠進(jìn)行中。
Annotatio從jdk1.5開始產(chǎn)生;他是代碼里面的特殊標(biāo)記,可以在編譯、類加載、運(yùn)行時(shí)被讀取,并執(zhí)行相應(yīng)的處理。
可以修飾包、類、構(gòu)造器、 成員變量、參數(shù)、局部變量的聲明;
框架 = 注解+反射+設(shè)計(jì)模式
@auth 標(biāo)明該模塊的作者,多個(gè)作者用,分割
@version 表明該類模塊的版本
@see 參考轉(zhuǎn)向,也就是相關(guān)主題;
@since 從哪個(gè)版本開始增加的;
@param 對(duì)方法中某些參數(shù)的說(shuō)明,如果沒(méi)有參數(shù)就不能寫
@return 對(duì)返回值的說(shuō)明,如果方法的返回值類型就void就不能寫
@exception 對(duì)方法可能拋出的一場(chǎng)進(jìn)行說(shuō)明,如果方法沒(méi)有又throws 顯示拋出異常,就不能寫其中
例如:
1 /** 2 * 3 * @author joy 4 * @Description: 5 * @date: 2021年3月25日 上午10:06:39 6 */ 7 public class Day22Annotation10 { 8 public static void main(String[] args) { 9 @SuppressWarnings("unused") 10 int a = 0; 11 } 12
View Code
補(bǔ)充:eclipse配置:
1 windows-->preference 2 Java-->Code Style-->Code Templates 3
在右側(cè)選擇Comments,將其中的Type項(xiàng),然后選右邊的"Edit",進(jìn)入編輯模式: /** * @author ${user} * @Description: * @date: ${date} ${time} * ${tags} */ 最后 apply and close;
@override 限定重寫父類方法 如下Student 中的 work 方法(如下代碼),如果student中寫錯(cuò)了work(如下圖),則編譯報(bào)錯(cuò);若沒(méi)有加override注解,那么如果work方法不會(huì)在編譯的時(shí)候被校驗(yàn); 若work在寫的時(shí)候?qū)懗闪藈ok()則也不會(huì)報(bào)錯(cuò);如果寫了override 則會(huì)報(bào)錯(cuò),顯示沒(méi)有重寫方法;
@Deprecated 用于表示所修飾的元素(類、方法等)已過(guò)時(shí);通常時(shí)因?yàn)樗揎椀慕Y(jié)構(gòu)危險(xiǎn)或存在更好的選擇;
@SuppressWarnIngs:抑制編譯警告
1 public class Day22Annotation10 { 2 public static void main(String[] args) { 3 Student student = new Student("aa",1); 4 student.work();//學(xué)生走了 5 } 6 } 7 class Person{ 8 private String name; 9 private int age; 10 11 public String getName() { 12 return name; 13 } 14 15 public void setName(String name) { 16 this.name = name; 17 } 18 19 public int getAge() { 20 return age; 21 } 22 23 public void setAge(int age) { 24 this.age = age; 25 } 26 public Person(String name, int age) { 27 super(); 28 this.name = name; 29 this.age = age; 30 } 31 32 public void work() { 33 System.out.println("人走了"); 34 } 35 public void eat() { 36 System.out.println("人吃飯"); 37 } 38 } 39 class Student extends Person{ 40 41 public Student(String name, int age) { 42 super(name, age); 43 // TODO Auto-generated constructor stub 44 } 45 46 @Override 47 public void work() { 48 System.out.println("學(xué)生走了"); 49 } 50
1.注解聲明:@interface
2.內(nèi)部成員定義,通常使用 value表示
3.可使用成員的默認(rèn)值,使用default定義
4.如果自定義注解沒(méi)有成員,表明是一個(gè)標(biāo)識(shí)作用;
如果注解有成員,在使用注解時(shí),需要指定成員的值,若有默認(rèn)值,則不需要指定;
自定義注解必須配上注解的信息處理流程(反射)才有意義;
通常指明Retention和Target
1 public @interface MyAnnotation { 2 3 String value() default "hello"; 4
1 @MyAnnotation//@MyAnnotation(value="hi") 2 class Student extends Person{ 3 4 public Student(String name, int age) { 5 super(name, age); 6 // TODO Auto-generated constructor stub 7 } 8 9 @Override 10 public void work() { 11 System.out.println("學(xué)生走了"); 12 } 13
只能定義Annotation的生命周期,
RetentionPolicy3種狀態(tài):SOURCE(編譯時(shí)拋棄注解) CLASS(編譯時(shí)保留注解) RUNTIME(執(zhí)行時(shí)保留注解,只有該狀態(tài)時(shí),反射才能調(diào))
eg.@Retention(RetentionPolicy.RUNTIOME)
只能定義Annotation的使用類型;(如下代碼)
類型:
@Target(ElementType.TYPE)——接口、類、枚舉、注解
@Target(ElementType.FIELD)——字段、枚舉的常量
@Target(ElementType.METHOD)——方法
@Target(ElementType.PARAMETER)——方法參數(shù)
@Target(ElementType.CONSTRUCTOR) ——構(gòu)造函數(shù)
@Target(ElementType.LOCAL_VARIABLE)——局部變量
@Target(ElementType.ANNOTATION_TYPE)——注解
@Target(ElementType.PACKAGE)——包
例如@Target({FIELD,CONSTRUCTOR});說(shuō)明該注解只能用在屬性和構(gòu)造器上,比如該注釋寫在方法前那就不行,會(huì)報(bào)錯(cuò);如下代碼;
元注釋的作用:修改時(shí)其他 annotation的annotation
元數(shù)據(jù):對(duì)現(xiàn)有數(shù)據(jù)的修飾的數(shù)據(jù);eg.String name = "joy";這里,String和name 就是元數(shù)據(jù);
1 @Retention(RetentionPolicy.RUNTIME) 2 @Target({TYPE, FIELD, PARAMETER,CONSTRUCTOR, ElementType.TYPE_PARAMETER,ElementType.TYPE_USE}) 3 public @interface MyAnnotation { 4 5 String value() default "hello"; 6
?、僭贛yAnnotation上聲明@Repeatable,成員值為MyAnotations.class
②MyAnotation的Rarget 和 Retention和MyAnotations相同;
1 @Retention(RetentionPolicy.RUNTIME) 2 @Target({ElementType.TYPE,ElementType.CONSTRUCTOR, ElementType.TYPE_PARAMETER,ElementType.TYPE_USE}) 3 public @interface MyAnnotations { 4 5 MyAnnotation[] value(); 6
1 @Repeatable(MyAnnotations.class) 2 @Retention(RetentionPolicy.RUNTIME) 3 @Target({ElementType.TYPE,ElementType.CONSTRUCTOR, ElementType.TYPE_PARAMETER,ElementType.TYPE_USE}) 4 public @interface MyAnnotation { 5 6 String value() default "hello"; 7
可重復(fù)注解實(shí)例:
@MyAnnotation(value="hi") @MyAnnotation class Student extends Person{ public Student(String name, int age) { super(name, age); // TODO Auto-generated constructor stub } @Override public void work() { System.out.println("學(xué)生走了"); } }
ElementType.TYPE_PARRAMETER 表示該注解能寫在類型變量的聲明語(yǔ)句種(如泛型聲明)
ElementType.TYPE_USE 表示該注解能寫在使用類型的任何語(yǔ)句中;
類型注解(可以修飾泛型)實(shí)例:
class Generic<@MyAnnotation T>{ public void show() throws RuntimeException{ int num = (@MyAnnotation int )10l; } }
class Generic<@MyAnnotation T>這里的@MyAnnotation,是因?yàn)樵O(shè)置了@Target({ElementType.TYPE,ElementType.CONSTRUCTOR, ElementType.TYPE_PARAMETER}) @Target設(shè)置了ElementType.TYPE_PARAMETER;所以@MyAnnotation這里不報(bào)錯(cuò);
int num = (@MyAnnotation int )10l;@Target設(shè)置了ElementType.TYPE_USE;所以這里(@MyAnnotation int )10l不報(bào)錯(cuò); 否則 報(bào)錯(cuò);
以上就是“Annotation注解怎么定義”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。