黑馬程式設計師基礎加強---註解
註解(未來的程式設計基於註解)
----------- android培訓、java培訓、java學習型技術部落格、期待與您交流! ------------
1.概述
概念:註解(也稱為元資料):為我們在程式碼中新增資訊提供了一種形式化的方法,使我們可以在稍後的某個時刻非常方便地使用這些資料。
註解在一定程度上是在把元資料與原始碼檔案結合在一起,而不是儲存在外部文件中這一大催勢之下所催生的。
註解的語法比較簡單,除了@符號的使用之外,它基本與Java固有的語法一致。Java SE5內建了三種,定義在java.lang中的註解。
1.1 三種內建註解
1. @Override:表示當前的方法定義將覆蓋超類中的方法。如果你不小心拼寫錯誤,或者方法名對不上被覆蓋的方法,編譯器會發出錯誤的提示。
class Animal{
public void eat(){
System.out.println("吃飯羅!");
}
}
class Dag extends Animal{
//@Override表示該方法是從父類中繼承下來的,方法名必須與父類某方法相等
@Override
public void eat(){
System.out.println("狗吃飯");
}
}
2.@Deprecated 如果程式設計師使用註解為它的元素,那麼編譯器會發出警告資訊。
public static void main(String[] args) { // TODO Auto-generated method stub Animal ani = new Animal(); ani.eat(); } } class Animal{ //@Deprecated該方法表示為過時的方法,可以編譯可以執行,但是有該方法出現的地方就會出現警告資訊 @Deprecated public void eat(){ System.out.println("吃飯羅!"); } }
3.@SuppressWarnings 關閉不當的編譯器警告資訊。
2.自定義Annotation
2.1 概述
概念:定義Annotation型別時,也需要用到定義介面的interface關鍵字,不過需要在interface關鍵字的前面加一個“@”符號,即定義Annotation型別的關鍵字是@interface,這個關鍵字隱含的意思是繼承自java.lang.annotation.Annotation介面。
語法:
public @interface MyAnnotation的名稱{}
2.2 標記註解(marker annotation):
沒有元素的註解,如上MyAnnotation。
在註解中,一般都會包含一些元素以表示某些值。當分析處理註解時,程式或工具可以利用這些值。註解的元素看起來像介面的方法。唯一的區別是你可以為其指定預設值。
如下註解:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface MyAnnotation {
String value()default "123";
}
這是一個用於類、介面、列舉,執行中載入到JVM裡面有一成員,其有預設值為”123”。
引數說明:
1. 註解可用的型別有八種基本型別、String、Class、Annotation、列舉、陣列。
2. Value,成員名稱,如果在所定義的Annotation型別中只包含一個成員,通常將名稱命名為value
2.3 元註解(註解中的註解)
Java內建了有三種標準註解,以及四種均註解,元註解專職負責註解其他的註解。
程式碼例項:
定義一個用來註釋構造方法的Annotation型別@Construction_Annotation,有效範圍為在執行時載入到Annotation到JVM中;還有一個用來註釋欄位、方法和引數的的Annotation型別的@Field_Method_Parameter_Annotation有效範圍在運動時載入Annotion到JVM中。
@Construction_Annotation的程式碼
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
//用於建構函式
@Target(ElementType.CONSTRUCTOR)
//在執行時載入到Annotatin到JVM中
@Retention(RetentionPolicy.RUNTIME)
public @interface ConStructor_Annotation {
//定義一個有預設值的String型成員
String value() default "預設構造方法";
}
@Field_Method_Parameter_Annotation的程式碼
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
//用於欄位、方法和引數
@Target({ElementType.FIELD,ElementType.METHOD,ElementType.PARAMETER})
//在執行時載入Annotation到JVM中
@Retention(RetentionPolicy.RUNTIME)
public @interface Field_Method_Parameter_Annotation {
//定義一個沒有預設值的String型成員
String describe();
//定義一個有預設值的Class型成員
Class type() default void.class;
}
Record的程式碼
public class Record {
@Field_Method_Parameter_Annotation(describe = "編號", type = int.class)
private int id;
@Field_Method_Parameter_Annotation(describe = "名字" , type = String.class)
private String name;
//因為其有預設值所以不需要填寫任何東西
@ConStructor_Annotation
public Record(){}
public Record(
//class有預設值,故可填可不填
@Field_Method_Parameter_Annotation(describe = "編號")
int id ,
@Field_Method_Parameter_Annotation(describe = "名字")
String name){
this.id = id;
this.name = name;
}
//註釋方法
@Field_Method_Parameter_Annotation(describe = "獲得編號",type = int.class)
public int getId() {
return id;
}
@Field_Method_Parameter_Annotation(describe = "設定編號")
public void setId(//註釋方法引數
@Field_Method_Parameter_Annotation(describe = "編號",type = int.class) int id)
{
this.id = id;
}
@Field_Method_Parameter_Annotation(describe = "得到名字")
public String getName() {
return name;
}
@Field_Method_Parameter_Annotation(describe = "設定名字")
public void setName(@Field_Method_Parameter_Annotation(describe = "名字", type = String.class) String name) {
this.name = name;
}
}
如上可見,註解就是一種特別的註釋,他會提醒使用者需要做什麼
3.訪問Annotation資訊
如果在定義Annotation型別時將@Retention設定為RetentionPolicy.RUNTIME,那麼在執行程式時通過反射就可以獲取相關的Annotatin資訊,如獲取構造方法,欄位和方法的Annotation資訊。
3.1 訪問Annotation的方法
程式碼例項(訪問上述例子的Annotation):
public static void main(String[] args) {
// TODO Auto-generated method stub
Class classR = null;
Record re = new Record();
classR = re.getClass();
System.out.println("===================獲得所有建構函式===================");
//獲得所有建構函式
Constructor[] declaredConstructors = classR.getDeclaredConstructors();
//遍歷建構函式
for (int i = 0; i < declaredConstructors.length; i++) {
Constructor constructor = declaredConstructors[i];
//檢視是否具有指定型別的註解
if (constructor.isAnnotationPresent(Constructor_Annotation.class)) {
//獲得指定型別的註解
Constructor_Annotation ca = (Constructor_Annotation) constructor
.getAnnotation(Constructor_Annotation.class);
// 獲得註釋的內容
System.out.println(ca.value());
}
//獲得引數的註解
Annotation[][] parameterAnnotations = constructor
.getParameterAnnotations();
for (int j = 0; j < parameterAnnotations.length; j++) {
//獲得指定引數註解的長度
int length = parameterAnnotations[j].length;
//如果長度為0,則表示沒有為該引數添加註解
if (length == 0) {
System.out.println("未新增Annotation引數");
} else {
for (int k = 0; k < length; k++) {
//獲得引數的註解
Field_Method_Parameter_Annotation pa = (Field_Method_Parameter_Annotation) parameterAnnotations[j][k];
//獲得引數的描述與型別
System.out.print(pa.describe() + " " + pa.type()
+ " ");
}
}
System.out.println();
}
}
System.out.println("====================獲得所有欄位的資訊========================");
//獲得所有欄位
Field[]declaredFields = classR.getDeclaredFields();
//遍歷欄位
for(int i = 0 ; i < declaredFields.length ; i ++){
Field field = declaredFields[i];
//獲得指定型別的註解
if(field.isAnnotationPresent(Field_Method_Parameter_Annotation.class)){
Field_Method_Parameter_Annotation fa = field.getAnnotation(Field_Method_Parameter_Annotation.class);
//獲得引數的描述與型別
System.out.println(fa.describe() + " " + fa.type());
}
}
System.out.println("=====================獲得訪問方法的資訊===============================");
//獲得所有方法
Method [] methods = classR.getDeclaredMethods();
//遍歷方法
for(int i = 0 ; i < methods.length ; i ++){
Method method = methods[i];
//檢視是否具有指定型別的註解
if(method.isAnnotationPresent(Field_Method_Parameter_Annotation.class)){
//獲得指定型別的註解
Field_Method_Parameter_Annotation ma = method.getAnnotation(Field_Method_Parameter_Annotation.class);
//獲得方法的描述與返回值型別
System.out.println(ma.describe() + " " + ma.type() );
}
//獲得方法的註解
Annotation [] []parameterAnnotations = method.getParameterAnnotations();
for(int j = 0 ; j < parameterAnnotations.length ; j ++ ){
//獲得指定註解的長度
int length = parameterAnnotations[j].length;
//如果長度為0,則表示沒有為該引數添加註解
if(length == 0){
System.out.println("未指定型別的註釋");
}else{
for(int k = 0 ; k < length ; k ++){
//獲得指定型別的註解
Field_Method_Parameter_Annotation pa = (Field_Method_Parameter_Annotation)parameterAnnotations[j][k];
//獲得引數的描述與型別
System.out.print(pa.describe() + "\n " + pa.type());
}
}
System.out.println();
}
}
}
}
輸出:
===================獲得所有建構函式===================
預設構造方法
有參建構函式
編號 int
名字 class java.lang.String
====================獲得所有欄位的資訊========================
編號 int
名字 class java.lang.String
=====================獲得訪問方法的資訊===============================
設定編號 void
編號
int
得到名字 class java.lang.String
獲得編號 int
設定名字 void
名字
class java.lang.String
----------- android培訓、java培訓、java學習型技術部落格、期待與您交流! ------------
相關推薦
黑馬程式設計師 基礎加強 註解
什麼是註解的屬性 一個註解相當於一個胸牌,如果你胸前貼了胸牌,就是傳智播客的學生,否則就不是。如果想區分出是傳智播客哪個班的學生,這時候可以為胸牌再增加一個屬性來進行區分。加了屬性的標記效果為:@MyAnnotation(color=”read”) 定義基本型別的屬性和應用屬性: 在註解類中增加String
黑馬程式設計師基礎加強---註解
註解(未來的程式設計基於註解) ----------- android培訓、java培訓、java學習型技術部落格、期待與您交流! ------------ 1.概述 概念:註解(也稱為元資料):為我們在程式碼中新增資訊提供了一種形式化的方法,使我們可以在稍後的某個
黑馬程式設計師-----基礎加強-反射
------<a href="http://www.itheima.com" target="blank">Java培訓、Android培訓、iOS培訓、.Net培訓</a>、期待與您交流! ------- 1.反射的概念和用途總述
黑馬程式設計師-----基礎加強-動態代理
------<a href="http://www.itheima.com" target="blank">Java培訓、Android培訓、iOS培訓、.Net培訓</a>、期待與您交流! ------- 代理類的作用與原理 1、生活中
黑馬程式設計師基礎-----基礎加強
靜態匯入: 靜態匯入是JDK1.5的新特性,比如Math類中的靜態方法,需要類名呼叫,也就是Math.max(3,6); 但是我們用靜態匯入的方法可以不用類名呼叫,直接寫方法掉用。寫法如下: 在包名的下邊輸入:import static java.lang.Math.ma
黑馬程式設計師——基礎知識--IO流
import java.io.*; public class Test { public static void main(String[] args) { try { String content = "Thank you for your fish
黑馬程式設計師-基礎部分(1
--------------------android培訓、java培訓、期待與您交流! -------------------- j2ee,j2se,j2me (中2的意思是版本2.0),5.0之後更名為JAVAEE,JAVASE,JAVAME, java的版本1.0/
黑馬程式設計師----oc加強筆記----記憶體管理
引用計數器: 每個OC物件都有自己的引用計數器,是一個整數表示物件被引用的次數,即現在有多少東西在使用這個物件。物件剛被建立時,預設計數器值為1,當計數器的值變為0時,則物件銷燬。 2)對引用計數器的操作
黑馬程式設計師——基礎學習---感言
------<a href="http://www.itheima.com" target="blank">Java培訓、Android培訓、iOS培訓、.Net培訓</a>、期待與您交流! ------- 在自學java基礎的時候,就有好幾個問題搞
黑馬程式設計師----基礎學習第十二天
------- android培訓、java培訓、期待與您交流! ----------
黑馬程式設計師_java基礎加強學習筆記之註解
------- <a href="http://www.itheima.com" target="blank">android培訓</a>、<a href="http://www.itheima.com" target="blank">j
黑馬程式設計師—java基礎加強—內省、註解、泛型
---------------------- android培訓、java培訓、期待與您交流! -------------------- 內省:IntroSpector——》JavaBean——特殊的Java類 當Java執行時可檢查自身,Java 程式中詢問它的一個物
黑馬程式設計師:基礎加強註解和泛型
---------------------- android培訓、java培訓、期待與您交流! ----------------------瞭解註解及Java提供的幾個基本註解:註解相當於一種標記,加了註解就等於打上了
黑馬程式設計師_基礎加強(註解)
---------------------- ASP.Net+Android+IO開發S、.Net培訓、期待與您交流! ---------------------- 註解(annotation)是jdk1.5的新特性 瞭解註解及java提供的幾個基本註解 1) 先通過@S
《黑馬程式設計師》基礎加強---註解
------- android培訓、java培訓、期待與您交流! ---------- 元註解: 元註解的作用就是負責註解其他註解。Java5.0定義了4個標準的meta-annotation型別,它們被用來提供對其它 annotation型別作說明。Java5.
『黑馬程式設計師』---java--基礎加強--列舉+註解
----------- android培訓、java培訓、java學習型技術部落格、期待與您交流! ------------ 列舉 package cn.itcast.day1; //1.5新特性 /* * Custom[定製] */ public class
黑馬程式設計師---java基礎加強---jdk1.5新特性之註解
----------- android培訓、java培訓、java學習型技術部落格、期待與您交流! ----------- 註解(Annotation ) 是JDK 1.5 的新特性,現已應用於Spring , EJB ,JPA... 使用註解是一種趨勢。它可以用於建立
黑馬程式設計師-java基礎加強-反射的深入講解
-------------------------ASP.Net+Unity開發、.Net培訓、期待與您交流!-------------------------- 透徹分析反射的基礎_Class類 Class類1、定義java程式中的各個java類也屬於同一類事物,而描述這
黑馬程式設計師---java基礎加強 反射的深入理解
=================第5單元:反射的深入講解=============== 17.透徹分析反射的基礎_Class類 反射的基礎: Class也就是每個java源程式通過編譯後生成的檔案載入進入記憶體的那個位元組碼檔案, 獲取到該位元組碼,就可以獲取
《黑馬程式設計師》基礎加強---eclipse加強
Ctrl+1 快速修復(最經典的快捷鍵,就不用多說了)Ctrl+D: 刪除當前行 Ctrl+Alt+↓ 複製當前行到下一行(複製增加)Ctrl+Alt+↑ 複製當前行到上一行(複製增加)Alt+↓ 當前行和下面一行互動位置(特別實用,可以省去先剪下,再貼上了)Alt+↑ 當前行和上面一行互動位置(同上)Alt