1. 程式人生 > >黑馬程式設計師基礎加強---註解

黑馬程式設計師基礎加強---註解

註解(未來的程式設計基於註解)

----------- 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