Annotation注解(有源代码)
注解(annotation)概述:
·從JDK5.0 開(kāi)始,java增加了對(duì)元數(shù)據(jù)(MetaData)的支持,也就是Annotation(注解)
·Annotation其實(shí)就是代碼里的特殊標(biāo)記,這些標(biāo)記可以在編譯,類加載,運(yùn)行時(shí)被讀取,并執(zhí)行相應(yīng)的處理。通過(guò)使用Annotation,程序員可以在不改變?cè)羞壿嫷那闆r下,在源文件中嵌入一些補(bǔ)充信息。
·Annotation可以像修飾符一樣被使用,可用于修飾包,類,構(gòu)造器,方法,成員變量,參數(shù),局部變量的聲明,這些信息被保存在Annotation的“name=value”對(duì)中。
·Annotation能被用來(lái)為程序元素(類,方法,成員變量等)設(shè)置元數(shù)據(jù)
基本的Annotation:
·使用Annotation時(shí)要在其前面增加@符號(hào),并把該Annotation當(dāng)成一個(gè)修飾符使用。用于修飾它支持的程序元素
·三個(gè)基本的Annotation:
1.@ Override:限定重寫父類方法,該注釋只能用于方法
2.@ Deprecated:用于表示某個(gè)程序元素(類,方法等)已過(guò)時(shí)
3.@ SuppressWarnings:抑制編譯器警告
自定義Annotation:
·定義新的Annotation類型使用@interface關(guān)鍵字
·Annotation的成員變量在Annotation定義中以無(wú)參數(shù)方法的形式來(lái)聲明。其方法名和返回值定義了該成員的名字和類型。
·可以在定義Annotation的成員變量時(shí)為其制定初始值,指定成員變量的初始值可使用default關(guān)鍵字
例:
public @interface MyAnnotation{
String name() default "liang"
}
·沒(méi)有成員定義的Annotation稱為標(biāo)記;包含成員變量的Annotation稱為元數(shù)據(jù)Annotation
提取Annotation信息:
·JDK5.0 在java.lang.reflect 包下新增了AnnotationElement接口,該接口代表程序中可以接受注解的程序元素
·當(dāng)一個(gè)Annotation類型被定義為運(yùn)行時(shí)可見(jiàn),當(dāng)class文件被載入時(shí)保存在class文件中的Annotation才會(huì)被虛擬機(jī)讀取
·程序可以調(diào)用AnnotationElement對(duì)象的如下方法來(lái)訪問(wèn)Annotation信息
?
?
JDK的元Annotation:
·JDK的元Annotation用于修飾其他Annotation定義
·JDK5.0 提供了專門在注解上的注解類型,分別是:
1.Retention
2.Target
3.Documented
4.Inherited
?
·@Retention:只用用于修飾一個(gè)Annotation定義,用于指定該Annotation可以保留多長(zhǎng)時(shí)間,@Retention包含一個(gè)RetentionPolicy類型的成員變量,使用@Retention時(shí)必須為該value成員變量指定值:
1.RetentionPolicy.SOURCE:編譯器直接直接丟棄這種策略的注釋
2.RetentionPolicy.CLASS(默認(rèn)):編譯器會(huì)把注釋記錄在class文件中。當(dāng)運(yùn)行java程序時(shí),JVM不會(huì)保留注解。這是 默認(rèn)值
3.RetentionPolicy.RUNTIME:編譯器將把注釋記錄在class文件中。當(dāng)運(yùn)行java程序時(shí),JVM會(huì)保留注釋。程序可以通過(guò)反射獲取該注釋。
·@Target:用于修飾Annotation定義,用于指定被修飾的Annotation能用于哪些程序元素。@Target也包含了一個(gè)名為value的成員變量。
@Documented:用于指定被該元Annotation修飾的Annotation類江北javadoc工具提取成文檔。
1.定義為Documented的注解必須設(shè)置Retention值為RUNTIME。
·@Inherited:被它修飾的Annotation將具有繼承性。如果某個(gè)類使用了被@Inherited修飾的Annotation,則其子類將自動(dòng)具有該注解(實(shí)際應(yīng)用中,使用較少)。
?
1 package com.demo; 2 /* 3 * 4 * 如何自定義一個(gè)注解 5 * 元注解 6 */ 7 public class TestAnnotation { 8 public static void main(String[] args) { 9 Person p = new Student(); 10 p.walk(); 11 } 12 } 13 14 class Student extends Person{ 15 16 @Override 17 public void walk() { 18 System.out.println("學(xué)生走路"); 19 } 20 @Override 21 public void eat() { 22 super.eat(); 23 } 24 } 25 class Person{ 26 @MyAnnotation(value="liang") 27 String name; 28 int age; 29 30 public Person() { 31 } 32 public Person(String name, int age) { 33 super(); 34 this.name = name; 35 this.age = age; 36 } 37 public void walk(){ 38 System.out.println("走路"); 39 } 40 @Deprecated 41 public void eat(){ 42 System.out.println("吃東西 "); 43 } 44 @Override 45 public String toString() { 46 return super.toString(); 47 } 48 49 } 1 package com.demo; 2 3 import java.lang.annotation.Retention; 4 import java.lang.annotation.RetentionPolicy; 5 import java.lang.annotation.Target; 6 import java.lang.reflect.Field; 7 import java.lang.annotation.ElementType; 8 //自定義的注解 9 @Target({ElementType.FIELD}) 10 @Retention(RetentionPolicy.RUNTIME) 11 public @interface MyAnnotation { 12 String value() default "Hello"; 13 }?
轉(zhuǎn)載于:https://www.cnblogs.com/liangxiaoyu/p/5119905.html
總結(jié)
以上是生活随笔為你收集整理的Annotation注解(有源代码)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 求解一个数的所有约数之积
- 下一篇: Unity 3D 离线协议