1. 程式人生 > 其它 >反射和註解

反射和註解

註解和反射

註解

內建註解

  • @Override(覆蓋,重寫)

定義在java.lang.Override中,用於修飾方法,只能用於重寫父類的方法的時候使用

  • @Deprecated(不贊成,強烈反對)

定義在java.lang.Deprecate中,此註解可用於修飾方法,屬性和類,表示不鼓勵程式設計師使用這樣的元素(但可以使用)通常是因為它很危險或者存在更好的選擇。

並且表示此方法已廢棄、暫時可用,但以後此類或方法都不會再更新、後期可能會刪除,建議後來人不要呼叫此方法。

  • SuppressWarnings(鎮壓警告)

定義在java.lang.SuppressWarnings中,用來抑制編譯時的警告資訊。

與前兩個註釋有所不同的是,這個註解需要新增一個系統定義好的引數才能正確使用。

相關引數如下:

引數說明
deprecation 使用了過時的類或者方法的警告
unchecked 執行了未檢查的轉換時的警告,如使用集合時未指定泛型
fallthrough 當在switch語句使用時發生case穿透
path 在類路徑、原始檔路徑等中有不存在路徑的警告
serial 當在可序化的類上缺少serialVersionUID定義時的警告
finally 任何finally字句不能完成時的警告
all 關於以上所有情況的警告

— 壓制一種的寫法為:

@SuppressWarnings("unchecked")

— 壓制兩種或兩種以上的寫法為:

@SuppressWarnings(value={"unchecked","deprecation"})

元註解

  • 元註解的作用是負責註解其他註解。java定義了4個標準的meta-annotation型別,它們被用來提供對其他annotation型別做出說明。

  • 四個型別分別為

    • @Target

      • 用於描述註解的使用範圍()

        @Target(Value=ElementType.TYPE)
    • @Retention(保留,維持)

      表示需要在什麼級別儲存該註釋資訊,用於解釋註釋的生命週期

      作用等級:SOURCE<CLASS<RUNTIME

      @Retention(RetentionPolicy.RUNTIME)
    • @Documented

    • @Inherited

自定義註解

@Interface

反射機制

動態語言

表示程式執行時,可以改變程式結構或變數型別,java不是動態語言,但是有一定的動態性,可以利用反射機制、位元組碼操作活得類似動態語言的特性。

反射機制

指的是可以與執行時載入,探知,使用編譯期間完全未知的類。

Class類介紹

  • java.lang.Class類十分特殊,用來表示java中型別(class、interface、enum、annotation、primitive type、void)本身

    — Class類的物件包含了某個被載入類的結構,一個被載入的類對應一個Class物件。

    — 當一個Class被載入,或當載入器(class loader)的defineClass()被JVM呼叫,JVM便會自動產生一個Class物件。

  • Class類是Reflection的根源。

— 針對任何想動態載入、執行的類,只有先獲得相應的Class物件。

Class類的物件獲取方法

  1. 運用getClass()

  2. 運用Class.forName() (最常被使用)

  3. 運用.class語法

Class clazz=Class.forName(包名+類名);

Class類常用的方法

clazz是上面的類名。

  • 獲取類的名字

    • clazz.getName() —獲得包名+類名

    • clazz.getSimpleName() —獲得類名

  • 獲取屬性資訊

    • clazz.getFields() —獲得public的field

    • clazz.getDeclaredFieds() —獲得所有的field

  • 獲取方法資訊

    • clazz.getMethods() —獲得public的方法

    • clazz.getDeclaredMethods() —獲得所有的方法

    • Method method=clazz.getDeclaredMethod(“方法名",方法的返回值型別(沒有的話為空)); —獲取單個方法

  • 獲取構造器資訊

    • Constructor[] constructors=c.getDeclaredConstructors();\\獲得所有構造器
    • Constructor[] constructors=c.getConstructors();\\獲得私有構造器

反射機制的常見作用

  • 動態載入類、動態獲取類的資訊(屬性,方法,構造器)

  • 動態構造物件

  • 動態呼叫類和物件的任意方法、構造器

  • 動態呼叫和處理屬性

  • 獲取泛型資訊

  • 處理註解