1. 程式人生 > >Java註解(Annotation)基本概念、自定義註解、註解解析器

Java註解(Annotation)基本概念、自定義註解、註解解析器

什麼是註解(Annotation):

  Annotation(註解)就是Java提供了一種元程式中的元素關聯任何資訊和著任何元資料(metadata)的途徑和方法。Annotion(註解)是一個介面,程式可以通過反射來獲取指定程式元素的Annotion物件,然後通過Annotion物件來獲取註解裡面的元資料。

  Annotation(註解)是JDK5.0及以後版本引入的。它可以用於建立文件,跟蹤程式碼中的依賴性,甚至執行基本編譯時檢查。從某些方面看,annotation就像修飾符一樣被使用,並應用於包、類 型、構造方法、方法、成員變數、引數、本地變數的宣告中。這些資訊被儲存在Annotation的“name=value”結構對中。

  Annotation的成員在Annotation型別中以無引數的方法的形式被宣告。其方法名和返回值定義了該成員的名字和型別。在此有一個特定的預設語法:允許宣告任何Annotation成員的預設值:一個Annotation可以將name=value對作為沒有定義預設值的Annotation成員的值,當然也可以使用name=value對來覆蓋其它成員預設值。這一點有些近似類的繼承特性,父類的建構函式可以作為子類的預設建構函式,但是也可以被子類覆蓋。

  Annotation能被用來為某個程式元素(類、方法、成員變數等)關聯任何的資訊。需要注意的是,這裡存在著一個基本的規則:Annotation不能影響程式程式碼的執行,無論增加、刪除 Annotation,程式碼都始終如一的執行。

另外,儘管一些annotation通過java的反射api方法在執行時被訪問,而java語言直譯器在工作時忽略了這些annotation。正是由於java虛擬機器忽略了Annotation,導致了annotation型別在程式碼中是“不起作用”的; 只有通過某種配套的工具才會對annotation型別中的資訊進行訪問和處理。本文中將涵蓋標準的Annotation和meta-annotation型別,陪伴這些annotation型別的工具是java編譯器(當然要以某種特殊的方式處理它們)。

什麼是metadata(元資料):

  元資料從metadata一詞譯來,就是“關於資料的資料”的意思。
  元資料的功能作用有很多,比如:你可能用過Javadoc的註釋自動生成文件。這就是元資料功能的一種。總的來說,元資料可以用來建立文件,跟蹤程式碼的依賴性,執行編譯時格式檢查,代替已有的配置檔案。如果要對於元資料的作用進行分類,目前還沒有明確的定義,不過我們可以根據它所起的作用,大致可分為三類:
    1. 編寫文件:通過程式碼裡標識的元資料生成文件
    2. 程式碼分析:通過程式碼裡標識的元資料對程式碼進行分析
    3. 編譯檢查:通過程式碼裡標識的元資料讓編譯器能實現基本的編譯檢查
  在Java中元資料以標籤的形式存在於Java程式碼中,元資料標籤的存在並不影響程式程式碼的編譯和執行,它只是被用來生成其它的檔案或針在執行時知道被執行程式碼的描述資訊。
  綜上所述:
    第一,元資料以標籤的形式存在於Java程式碼中。
    第二,元資料描述的資訊是型別安全的,即元資料內部的欄位都是有明確型別的。
    第三,元資料需要編譯器之外的工具額外的處理用來生成其它的程式部件。
    第四,元資料可以只存在於Java原始碼級別,也可以存在於編譯之後的Class檔案內部。

 Annotation和Annotation型別:

  Annotation:

  Annotation使用了在java5.0所帶來的新語法,它的行為十分類似public、final這樣的修飾符。每個Annotation具有一個名字和成員個數>=0。每個Annotation的成員具有被稱為name=value對的名字和值(就像javabean一樣),name=value裝載了Annotation的資訊。

  Annotation型別:

Annotation型別定義了Annotation的名字、型別、成員預設值。一個Annotation型別可以說是一個特殊的java介面,它的成員變數是受限制的,而宣告Annotation型別時需要使用新語法。當我們通過java反射api訪問Annotation時,返回值將是一個實現了該 annotation型別介面的物件,通過訪問這個物件我們能方便的訪問到其Annotation成員。後面的章節將提到在java5.0的 java.lang包裡包含的3個標準Annotation型別。

註解的分類:

  根據註解引數的個數,我們可以將註解分為三類:
    1.標記註解:一個沒有成員定義的Annotation型別被稱為標記註解。這種Annotation型別僅使用自身的存在與否來為我們提供資訊。比如後面的系統註解@Override;
    2.單值註解
    3.完整註解  

  根據註解使用方法和用途,我們可以將Annotation分為三類:
    1.JDK內建系統註解
    2.元註解
    3.自定義註解

 系統內建標準註解:

  註解的語法比較簡單,除了@符號的使用外,他基本與Java固有的語法一致,JavaSE中內建三個標準註解,定義在java.lang中:
    @Override:用於修飾此方法覆蓋了父類的方法;
    @Deprecated:用於修飾已經過時的方法;
    @SuppressWarnnings:用於通知java編譯器禁止特定的編譯警告。

  下面我們依次看看三個內建標準註解的作用和使用場景。

   @Override,限定重寫父類方法

  @Override 是一個標記註解型別,它被用作標註方法。它說明了被標註的方法過載了父類的方法,起到了斷言的作用。如果我們使用了這種Annotation在一個沒有覆蓋父類方法的方法時,java編譯器將以一個編譯錯誤來警示。這個annotaton常常在我們試圖覆蓋父類方法而確又寫錯了方法名時發揮威力。使用方法極其簡單:在使用此annotation時只要在被修飾的方法前面加上@Override即可。下面的程式碼是一個使用@Override修飾一個企圖過載父類的displayName()方法,而又存在拼寫錯誤的例項:

複製程式碼
public class Fruit {

    public void displayName(){
        System.out.println("水果的名字是:*****");
    }
}

class Orange extends Fruit {
    @Override
    public void displayName(){
        System.out.println("水果的名字是:桔子");
    }
}

class Apple extends Fruit {
    @Override
    public void displayname(){
        System.out.println("水果的名字是:蘋果");
    }
}
複製程式碼
  Orange 類編譯不會有任何問題,Apple 類在編譯的時候會提示相應的錯誤。@Override註解只能用於方法,不能用於其他程式元素。

@Deprecated,標記已過時:

  同 樣Deprecated也是一個標記註解。當一個型別或者型別成員使用@Deprecated修飾的話,編譯器將不鼓勵使用這個被標註的程式元素。而且這種修飾具有一定的 “延續性”:如果我們在程式碼中通過繼承或者覆蓋的方式使用了這個過時的型別或者成員,雖然繼承或者覆蓋後的型別或者成員並不是被宣告為 @Deprecated,但編譯器仍然要報警。

  值得注意,@Deprecated這個annotation型別和javadoc中的 @deprecated這個tag是有區別的:前者是java編譯器識別的,而後者是被javadoc工具所識別用來生成文件(包含程式成員為什麼已經過 時、它應當如何被禁止或者替代的描述)。

  在java5.0,java編譯器仍然象其從前版本那樣尋找@deprecated這個javadoc tag,並使用它們產生警告資訊。但是這種狀況將在後續版本中改變,我們應在現在就開始使用@Deprecated來修飾過時的方法而不是 @deprecated javadoc tag。

  下面一段程式中使用了@Deprecated註解標示方法過期,同時在方法註釋中用@deprecated tag 標示該方法已經過時,程式碼如下:

複製程式碼
 class AppleService {
    public void displayName(){
        System.out.println("水果的名字是:蘋果");
    }
    
    /**
     * @deprecated 該方法已經過期,不推薦使用
     */
    @Deprecated
    public void showTaste(){
        System.out.println("水果的蘋果的口感是:脆甜");
    }
    
    public void showTaste(int typeId){
        if(typeId==1){
            System.out.println("水果的蘋果的口感是:酸澀");
        }
        else if(typeId==2){
            System.out.println("水果的蘋果的口感是:綿甜");
        }
        else{
            System.out.println("水果的蘋果的口感是:脆甜");
        }
    }
}

public class FruitRun {

    /**
     * @param args
     */
    public static void main(String[] args) {
        Apple apple=new Apple();
        apple.displayName();    
        
        AppleService appleService=new AppleService();
        appleService.showTaste();
        appleService.showTaste(0);
        appleService.showTaste(2);
    }

}
複製程式碼

  AppleService類的showTaste() 方法被@Deprecated標註為過時方法,在FruitRun類中使用的時候,編譯器會給出該方法已過期,不推薦使用的提示。

SuppressWarnnings,抑制編譯器警告:

  @SuppressWarnings 被用於有選擇的關閉編譯器對類、方法、成員變數、變數初始化的警告。在java5.0,sun提供的javac編譯器為我們提供了-Xlint選項來使編譯器對合法的程式程式碼提出警告,此種警告從某種程度上代表了程式錯誤。例如當我們使用一個generic collection類而又沒有提供它的型別時,編譯器將提示出"unchecked warning"的警告。通常當這種情況發生時,我們就需要查詢引起警告的程式碼。如果它真的表示錯誤,我們就需要糾正它。例如如果警告資訊表明我們程式碼中的switch語句沒有覆蓋所有可能的case,那麼我們就應增加一個預設的case來避免這種警告。
  有時我們無法避免這種警告,例如,我們使用必須和非generic的舊程式碼互動的generic collection類時,我們不能避免這個unchecked warning。此時@SuppressWarning就要派上用場了,在呼叫的方法前增加@SuppressWarnings修飾,告訴編譯器停止對此方法的警告。
  SuppressWarning不是一個標記註解。它有一個型別為String[]的成員,這個成員的值為被禁止的警告名。對於javac編譯器來講,被-Xlint選項有效的警告 名也同樣對@SuppressWarings有效,同時編譯器忽略掉無法識別的警告名。
  annotation語法允許在annotation名後跟括號,括號中是使用逗號分割的name=value對用於為annotation的成員賦值。例項如下:

複製程式碼
public class FruitService {
    
    @SuppressWarnings(value={ "rawtypes", "unchecked" })
    public static  List<Fruit> getFruitList(){
        List<Fruit> fruitList=new ArrayList();
        return fruitList;
    }
    
    @SuppressWarnings({ "rawtypes", "unchecked" })
    public static  List<Fruit> getFruit(){
        List<Fruit> fruitList=new ArrayList();
        return fruitList;
    }

    @SuppressWarnings("unused")
    public static void main(String[] args){
        List<String> strList=new ArrayList<String>();
    }
}
複製程式碼

  在這個例子中SuppressWarnings annotation型別只定義了一個單一的成員,所以只有一個簡單的value={...}作為name=value對。又由於成員值是一個數組,故使用大括號來宣告陣列值。注意:我們可以在下面的情況中縮寫annotation:當annotation只有單一成員,併成員命名為"value="。這時可以省去"value="。比如將上面方法getFruit()的SuppressWarnings annotation就是縮寫的。

   SuppressWarnings註解的常見引數值的簡單說明:

    1.deprecation:使用了不贊成使用的類或方法時的警告;
    2.unchecked:執行了未檢查的轉換時的警告,例如當使用集合時沒有用泛型 (Generics) 來指定集合儲存的型別;
    3.fallthrough:當 Switch 程式塊直接通往下一種情況而沒有 Break 時的警告;
    4.path:在類路徑、原始檔路徑等中有不存在的路徑時的警告;
    5.serial:當在可序列化的類上缺少 serialVersionUID 定義時的警告;
    6.finally:任何 finally 子句不能正常完成時的警告;
    7.all:關於以上所有情況的警告。

要深入學習註解,我們就必須能定義自己的註解,並使用註解,在定義自己的註解之前,我們就必須要了解Java為我們提供的元註解和相關定義註解的語法。

元註解:

  元註解的作用就是負責註解其他註解。Java5.0定義了4個標準的meta-annotation型別,它們被用來提供對其它 annotation型別作說明。Java5.0定義的元註解:
    [email protected],
    [email protected],
    [email protected],
    [email protected]
  這些型別和它們所支援的類在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宣告

  使用例項:  

複製程式碼
@Target(ElementType.TYPE)
public @interface Table {
    /**
     * 資料表名稱註解,預設值為類名稱
     * @return
     */
    public String tableName() default "className";
}

@Target(ElementType.FIELD)
public @interface NoDBColumn {

}
複製程式碼

  註解Table 可以用於註解類、介面(包括註解型別) 或enum宣告,而註解NoDBColumn僅可用於註解類的成員變數。

  @Retention:

  @Retention定義了該Annotation被保留的時間長短:某些Annotation僅出現在原始碼中,而被編譯器丟棄;而另一些卻被編譯在class檔案中;編譯在class檔案中的Annotation可能會被虛擬機器忽略,而另一些在class被裝載時將被讀取(請注意並不影響class的執行,因為Annotation與class在使用上是被分離的)。使用這個meta-Annotation可以對 Annotation的“生命週期”限制。

  作用:表示需要在什麼級別儲存該註釋資訊,用於描述註解的生命週期(即:被描述的註解在什麼範圍內有效)

  取值(RetentionPoicy)有:

    1.SOURCE:在原始檔中有效(即原始檔保留)
    2.CLASS:在class檔案中有效(即class保留)
    3.RUNTIME:在執行時有效(即執行時保留)

  Retention meta-annotation型別有唯一的value作為成員,它的取值來自java.lang.annotation.RetentionPolicy的列舉型別值。具體例項如下:

複製程式碼
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
    public String name() default "fieldName";
    public String setFuncName() default "setField";
    public String getFuncName() default "getField"; 
    public boolean defaultDBValue() default false;
}
複製程式碼

   Column註解的的RetentionPolicy的屬性值是RUTIME,這樣註解處理器可以通過反射,獲取到該註解的屬性值,從而去做一些執行時的邏輯處理

  @Documented:

  @Documented用於描述其它型別的annotation應該被作為被標註的程式成員的公共API,因此可以被例如javadoc此類的工具文件化。Documented是一個標記註解,沒有成員。

複製程式碼
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Column {
    public String name() default "fieldName";
    public String setFuncName() default "setField";
    public String getFuncName() default "getField"; 
    public boolean defaultDBValue() default false;
}
複製程式碼

  @Inherited:

@Inherited 元註解是一個標記註解,@Inherited闡述了某個被標註的型別是被繼承的。如果一個使用了@Inherited修飾的annotation型別被用於一個class,則這個annotation將被用於該class的子類。

  注意:@Inherited annotation型別是被標註過的class的子類所繼承。類並不從它所實現的介面繼承annotation,方法並不從它所過載的方法繼承annotation。

  當@Inherited annotation型別標註的annotation的Retention是RetentionPolicy.RUNTIME,則反射API增強了這種繼承性。如果我們使用java.lang.reflect去查詢一個@Inherited annotation型別的annotation時,反射程式碼檢查將展開工作:檢查class和其父類,直到發現指定的annotation型別被發現,或者到達類繼承結構的頂層。

  例項程式碼:

複製程式碼
/**
 * 
 * @author peida
 *
 */
@Inherited
public @interface Greeting {
    public enum FontColor{ BULE,RED,GREEN};
    String name();
    FontColor fontColor() default FontColor.GREEN;
}
複製程式碼

自定義註解:

  使用@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.以上所有型別的陣列

  Annotation型別裡面的引數該怎麼設定:
  第一,只能用public或預設(default)這兩個訪問權修飾.例如,String value();這裡把方法設為defaul預設型別;   
  第二,引數成員只能用基本型別byte,short,char,int,long,float,double,boolean八種基本資料型別和 String,Enum,Class,annotations等資料型別,以及這一些型別的陣列.例如,String value();這裡的引數成員就為String;  
  第三,如果只有一個引數成員,最好把引數名稱設為"value",後加小括號.例:下面的例子FruitName註解就只有一個引數成員。

  簡單的自定義註解和使用註解例項:

複製程式碼
package annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 水果名稱註解
 * @author peida
 *
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FruitName {
    String value() default "";
}
複製程式碼複製程式碼
package annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 水果顏色註解
 * @author peida
 *
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FruitColor {
    /**
     * 顏色列舉
     * @author peida
     *
     */
    public enum Color{ BULE,RED,GREEN};
    
    /**
     * 顏色屬性
     * @return
     */
    Color fruitColor() default Color.GREEN;

}
複製程式碼複製程式碼
package annotation;

import annotation.FruitColor.Color;

public class Apple {
    
    @FruitName("Apple")
    private String appleName;
    
    @FruitColor(fruitColor=Color.RED)
    private String appleColor;
    
    
    
    
    public void setAppleColor(String appleColor) {
        this.appleColor = appleColor;
    }
    public String getAppleColor() {
        return appleColor;
    }
    
    
    public void setAppleName(String appleName) {
        this.appleName = appleName;
    }
    public String getAppleName() {
        return appleName;
    }
    
    public void displayName(){
        System.out.println("水果的名字是:蘋果");
    }
}
複製程式碼

註解元素的預設值:

註解元素必須有確定的值,要麼在定義註解的預設值中指定,要麼在使用註解時指定,非基本型別的註解元素的值不可為null。因此, 使用空字串或0作為預設值是一種常用的做法。這個約束使得處理器很難表現一個元素的存在或缺失的狀態,因為每個註解的宣告中,所有元素都存在,並且都具有相應的值,為了繞開這個約束,我們只能定義一些特殊的值,例如空字串或者負數,一次表示某個元素不存在,在定義註解時,這已經成為一個習慣用法。例如:

複製程式碼
 1 package annotation;
 2 
 3 import java.lang.annotation.Documented;
 4 import java.lang.annotation.ElementType;
 5 import java.lang.annotation.Retention;
 6 import java.lang.annotation.RetentionPolicy;
 7 import java.lang.annotation.Target;
 8 
 9 /**
10  * 水果供應者註解
11  * @author peida
12  *
13  */
14 @Target(ElementType.FIELD)
15 @Retention(RetentionPolicy.RUNTIME)
16 @Documented
17 public @interface FruitProvider {
18     /**
19      * 供應商編號
20      * @return
21      */
22     public int id() default -1;
23     
24     /**
25      * 供應商名稱
26      * @return
27      */
28     public String name() default "";
29     
30     /**
31      * 供應商地址

            
           

相關推薦

Java註解Annotation基本概念定義註解註解解析

什麼是註解(Annotation):  Annotation(註解)就是Java提供了一種元程式中的元素關聯任何資訊和著任何元資料(metadata)的途徑和方法。Annotion(註解)是一個介面,程式可以通過反射來獲取指定程式元素的Annotion物件,然後通過Annotion物件來獲取註解裡面的元資料。

定義註解日誌輸出:定義日誌註解+AOP實現

自定義日誌標籤YfLog 日誌註解:以日誌自定義註解+AOP實現 ####1、引入AOP Maven依賴 <!--springBoot 的aop--> <dependency> <groupId>org.springf

深入理解Java註解Annotation--註解處理器

fault this urn 復制代碼 lena ide set java lec 深入理解Java:註解(Annotation)--註解處理器   如果沒有用來讀取註解的方法和工作,那麽註解也就不會比註釋更有用處了。使用註解的過程中,很重要的一部分就是創建於

深入理解Java註解Annotation註解處理器3

isp 通過反射 out peid 擴展 .cn 自定義註解 忽略 否則 如果沒有用來讀取註解的方法和工作,那麽註解也就不會比註釋更有用處了。使用註解的過程中,很重要的一部分就是創建於使用註解處理器。Java SE5擴展了反射機制的API,以幫助程序員快速的構造自定義註解處

秒懂,Java 註解 Annotation你可以這樣學

face 幹什麽 有一種 博客 作用 習慣 lis 如果 手機 這處圖片引自老羅的博客。為了避免不必要的麻煩,首先聲明我個人比較尊敬老羅的。至於為什麽放這張圖,自然是為本篇博文服務,接下來我自會說明。好了,可以開始今天的博文了。 Annotation 中文譯過來就是註解、

Java 註解 Annotation

null lambda roi 實例 cut exce runt 比較 符號 Java 註解用於為 Java 代碼提供元數據。作為元數據,註解不直接影響你的代碼執行,但也有一些類型的註解實際上可以用於這一目的。Java 註解是從 Java5 開始添加到 Java 的。

秒懂Java 註解 Annotation

能夠 extend tty 來講 hub 開頭 arrays term con 文章開頭先引入一處圖片。 這處圖片引自老羅的博客。為了避免不必要的麻煩,首先聲明我個人比較尊敬老羅的。至於為什麽放這張圖,自然是為本篇博文服務,接下來我自會說明。好了,可以開始今天的博文了。 A

Java基礎】註解Annotation

  Annotation,程式碼裡的特殊標記,在編譯、類載入、執行時被讀取,並執行相應的處理。 使用註解,在不改變原有邏輯的情況下,在原始檔中嵌入一些補充資訊。 Annotation提供了一種為程式元素設定元資料的方法。 Ann

java註解Annotation總結

java註解(Annotation)總結 吐糟時間 註解是什麼 註解有什麼用 註解的分類 怎麼自定義註解 新增屬性 註解的使用 解析執行時(RUNTIME)註解 解析編譯時(CLASS)註解

java1基本概念整理+eclipse安裝配置

基本概念以及與python的區別: 1 明確原始檔,類,方法,語句這幾個概念 2 while()和if()的條件只能是布林值,以下程式不行,但是python卻可以 int x=1; while(x){} //if(x){} 3 println相比print多了一個換行的功能

Java 註解 Annotation淺入深出

Java 註解 (Annotation)淺入深出 本文主要參考與借鑑frank909 文章,但更為簡單,詳細。 Annotation 中文譯過來就是註解、標釋的意思。Annotation是一種應用於類、方法、引數、變數、構造器及包宣告中的特殊修飾符。它是一種由JSR-175標準選擇用來描述元資料的一種工具

Java 註解Annotation) 的基本使用和理解

1.註解 概念:相當於標籤 2.註解的型別 2.1 元註解 概念:元註解是可以註解到註解上的註解,或者說元註解是一種基本註解,但是它能夠應用到其它的註解上面 元註解的種類 @Retention @Documented @Target @Inherited

Java註解Annotation學習總結

註解的定義 註解通過 @interface 關鍵字進行定義。 public @interface TestAnnotation { } 它的形式跟介面很類似,不過前面多了一個 @ 符號。上面的程式碼就建立了一個名字為 TestAnnotaion 的註解。你可以簡

Java——註解Annotation

註解(Annotation) JDK提供的三個內建註解:@Override、@Deprecated、@SuppressWarnings 1.準確覆寫@Override 檢查當前類中的覆寫方法與父類中定義的同名方法是否相同,如果有任何一個地方不同,編譯報錯 2.過期處理

java高併發基本概念:併發和並行

併發和並行以前總是被我弄混,甚至以為是一樣的,但是現在發現並不是這樣 併發:實質為多工交替執行。微觀看為序列;因為cpu執行太快,巨集觀看,被認為是多個任務一起執行的。如圖:實線和虛線代表兩個不同的任務微觀上序列的執行著。如果系統為單核cpu,這時若有多個程序

定義Java註解annotation

https://www.imooc.com/learn/456  筆記 Java從1.5開始引進註解。 首先解決一個問題,為什麼要學習Java註解? 1.看懂別人寫的程式碼,尤其是框架的程式碼 2.可以是自己寫的程式碼簡潔清晰   現在開始學習Java註解了。  

Java 註解 Annotation你可以這樣學

這處圖片引自老羅的部落格。為了避免不必要的麻煩,首先宣告我個人比較尊敬老羅的。至於為什麼放這張圖,自然是為本篇博文服務,接下來我自會說明。好了,可以開始今天的博文了。Annotation 中文譯過來就是註解、標釋的意思,在 Java 中註解是一個很重要的知識點,但經常還是有點

卷積神經網路CNN基本概念卷積

卷積神經網路(Convolutional Neural Network)是一個專門針對影象識別問題設計的神經網路。它模仿人類識別影象的多層過程:瞳孔攝入畫素;大腦皮層某些細胞初步處理,發現形狀邊緣、方向;抽象判定形狀(如圓形、方形);進一步抽象判定(如判斷物體是氣球)。CNN

深入理解Java註解Annotation定義註解

要深入學習註解,我們就必須能定義自己的註解,並使用註解,在定義自己的註解之前,我們就必須要了解Java為我們提供的元註解和相關定義註解的語法。 元註解:   元註解的作用就是負責註解其他註解。Java5.0定義了4個標準的meta-annotation型別,它們被用來

Java註解Annotation介紹

註解(Annotation)是Java5開始引入的新特性。他提供了一種安全的類似註釋的機制,用來將任何的資訊或元資料(metadata)與程式元素(類、方法、成員變數等)進行關聯。        註解