Java注解
Annotation(注解)是JDK5.0及以后版本引入的。它可以用於創建文檔,跟蹤代碼中的依賴性,甚至執行基本編譯時檢查。注解是以‘@注解名’在代碼中存在的,根據注解參數的個數,我們可以將注解分為:標記注解、單值注解、完整注解三類。它們都不會直接影響到程序的語義,只是作為注解(標識)存在,我們可以通過反射機制編程實現對這些元數據(用來描述數據的數據)的訪問。另外,你可以在編譯時選擇代碼里的注解是否只存在於源代碼級,或者它也能在class文件中出現。
在寫代碼過程常遇到的注解有@Override、@SuppressWarnings,@Override注解表示重寫父類方法,、@SuppressWarnings注解表示忽略警告信息
關於四個作用相同注解
@Component("info") 不分層
@Repository("info") dao
@Service("info") biz
@Controller("info") action
@Value() 在一個類中注入普通屬性值
@Resource 在一個類中注入域屬性
@Autowired 在一個類中注入域屬性
注解(Annotation)自定義注解入門
元注解的作用就是負責注解其他注解。Java5.0定義了4個標准的meta-annotation類型,它們被用來提供對其它 annotation類型作說明。Java5.0定義的元注解:
1.@Target,
2.@Retention,
3.@Documented,
4.@Inherited
這些類型和它們所支持的類在java.lang.annotation包中可以找到。下面我們看一下每個元注解的作用和相應分參數的使用說明。
@Target:
@Target說明了Annotation所修飾的對象范圍:Annotation可被用於 packages、types(類、接口、枚舉、Annotation類型)、類型成員(方法、構造方法、成員變量、枚舉值)、方法參數和本地變量(如循環變量、catch參數)。在Annotation類型的聲明中使用了target可更加明晰其修飾的目標。
作用:用於描述注解的使用范圍(即:被描述的注解可以用在什么地方)
取值(ElementType)有:
1.CONSTRUCTOR:用於描述構造器
2.FIELD:用於描述域
3.LOCAL_VARIABLE:用於描述局部變量
4.METHOD:用於描述方法
5.PACKAGE:用於描述包
6.PARAMETER:用於描述參數
7.TYPE:用於描述類、接口(包括注解類型) 或enum聲明
使用@interface自定義注解時,自動繼承了java.lang.annotation.Annotation接口,由編譯程序自動完成其他細節。在定義注解時,不能繼承其他的注解或接口。@interface用來聲明一個注解,其中的每一個方法實際上是聲明了一個配置參數。方法的名稱就是參數的名稱,返回值類型就是參數的類型(返回值類型只能是基本類型、Class、String、enum)。可以通過default來聲明參數的默認值。
定義注解格式:
public @interface 注解名 {定義體}
注解參數的可支持數據類型:
1.所有基本數據類型(int,float,boolean,byte,double,char,long,short)
2.String類型
3.Class類型
4.enum類型
5.Annotation類型
6.以上所有類型的數組
自定義注解案例:
1.自定義注解
1 @Target(ElementType.METHOD) 2 @Retention(RetentionPolicy.RUNTIME) 3 @Documented 4 public @interface Apple { 5 String name(); 6 String sex() default "男"; 7 String phone() default "15931787945"; 8 int age() default 2; 9 }
2.使用注解的類:
1 public class AppleTest { 2 @Apple(name="張朵朵") 3 public void show(){ 4 5 } 6 }
3.提取注解參數:
1 public class Test20171010{ 2 @Test 3 public void test01(){ 4 Class<AppleTest> appleTestClass = AppleTest.class; 5 try { 6 Apple show = appleTestClass.getMethod("show").getAnnotation(Apple.class); 7 System.out.println(show.name()); 8 System.out.println(show.sex()); 9 System.out.println(show.phone()); 10 System.out.println(show.age()); 11 } catch (NoSuchMethodException e) { 12 e.printStackTrace(); 13 } 14 } 15 }
執行結果: