Java学习笔记7-1——注解与反射
目錄
- 注解
- 注解是啥
- 內置注解
- 元注解
- @Target
- @Retention
- @Documented
- @Inherited
- 自定義注解
- 反射
- 靜態語言 和 動態語言
- Java 反射機制概述
- Java 反射機制提供的功能
- Java 反射優點和缺點
- 反射相關的主要 API
注解
注解是啥
- 注解(Annotation)是從 JDK 1.5 開始引入的新技術
Annotation 的作用:
- 不是程序本身,可以對程序作出解釋(這一點和注釋沒什么區別)
- 可以被其它程序(比如:編譯器等)讀取
Annotation 的格式:
- 注解是以 “@注釋名” 在代碼中存在的,還可以添加一些參數值,例如:@SuppressWarnings(value=“unchecked”)
Annotation 在哪里使用?
- 可以附加在 package,class,method,field等上面,相當于給他們添加了額外的輔助信息,我們可以通過反射機制編程實現對這些元數據的訪問
內置注解
- @Override:定義在 java.lang.Override中,此注解只適用于修辭方法,表示一個方法聲明打算重寫超類中的另一個方法聲明
- @Deprecated:定義在 java.lang.Deprecated中,此注釋可以用于修辭方法,屬性,類,表示不鼓勵程序員使用這樣的元素,通常是因為它很危險或者存在更好的選擇
- @SuppressWarnings:定義在 java.lang.SuppressWarings中,用來抑制編譯時的警告信息,與前兩個注釋有所不同,你需要添加一個參數才能正確使用,這些參數都是已經定義好了的,我們選擇性的使用就好了
@SuppressWarnings(“all”)
@SuppressWarnings(“unchecked”)
@SuppressWarnings(value={“unchecked”,“deprecation”})
等等…
元注解
- 元注解的作用就是負責注解其它注解,Java 定義了 4 個標準的 meta-annotation 類型,它們被用來提供對其它注解類型做說明
- 這些類型和它們所支持的類在 java.lang.annotation包中可以找到(@Target,@Retention,@Documented,@Inherited)
@Target
用于描述注解的作用域
@Target(ElementType.TYPE) // 接口、類、枚舉、注解 @Target(ElementType.FIELD) // 字段、枚舉的常量 @Target(ElementType.METHOD) // 方法 @Target(ElementType.PARAMETER) // 方法參數 @Target(ElementType.CONSTRUCTOR) // 構造函數 @Target(ElementType.LOCAL_VARIABLE) // 局部變量 @Target(ElementType.ANNOTATION_TYPE) // 注解 @Target(ElementType.PACKAGE) // 包@Retention
表示需要在什么級別保存該注釋信息,用于描述注解的生命周期(SOURCE < CLASS < RUNTIME)
- RetentionPolicy.SOURCE
這種類型的Annotations只在源代碼級別保留,編譯時就會被忽略,在class字節碼文件中不包含。 - RetentionPolicy.CLASS
這種類型的Annotations編譯時被保留,默認的保留策略,在class文件中存在,但JVM將會忽略,運行時無法獲得。 - RetentionPolicy.RUNTIME
這種類型的Annotations將被JVM保留,所以他們能在運行時被JVM或其他使用反射機制的代碼所讀取和使用。
@Documented
說明該注解將被包含在 javadoc 中
@Inherited
說明子類可以繼承父類中的該注解
自定義注解
- 使用 @interface 自定義注解時,自動繼承了java.lang.annotation.Annotation 接口
分析:
- @interface 用來聲明一個注解,格式:public @interface 注解名 {定義內容}
- 其中的每一個方法實際上是聲明了一個配置參數
- 方法的名稱就是參數的名稱
- 返回值類型就是參數的類型(返回值只能是基本類型,Class,String,enum)
- 可以通過 default 來聲明參數的默認值
- 如果只有一個參數成員,一般參數名為 value
- 注解元素必須要有值,我們定義注解元素時,經常使用空字符串,0 作為默認值
反射
反射的應用可以參考這篇詳細的文章Java反射機制的簡單使用
靜態語言 和 動態語言
動態語言
動態語言是一類在運行時可以改變其結構的語言:例如新的函數、對象、甚至代碼可以被引進,已有的函數可以被刪除或是其它結構上的變化。通俗一點說就是在運行時代碼可以根據某些條件改變自身結構。如:Python、JavaScript、C#、PHP等
靜態語言
與動態語言相對應,運行時結構不可變的語言就是靜態語言,如 Java、C、C++
Java 不是靜態語言,但是 Java 可以稱之為 “準動態語言”。即 Java 有一定的動態性,我們可以利用反射機制獲得類似動態語言的特性。Java 的動態性讓編程的時候更加靈活
Java 反射機制概述
Reflection(反射)是 Java 被視為動態語言的關鍵,反射機制允許程序在執行期借助于 Reflection API 取得任何類的內部信息,并能直接操作任意對象的內部屬性以及方法
Class c = Class.forName("java.lang.String");加載完類之后,在堆內存的方法區中就產生了一個 Class 類型的對象(一個類只有一個 Class 對象),這個對象就包含了完整類的類的結構信息。我們可以通過對這個對象看到的類的結構。這個對象就像一面鏡子,通過這個鏡子看到類的結構,所以,我們形象地稱之為:反射
正常方式:
引入需要的 “ 包類 ” 名稱 ——> 通過 new 實例化 ——> 取得實例化對象
反射方式(正常方式反過來):
實例化對象 ——> getClass() 方法 ——> 得到完整的 “包類” 名稱
Java 反射機制提供的功能
在運行時判斷任意一個對象所屬的類
在運行時構造任意一個類的對象
在運行時判斷任意一個類所具有的成員變量和方法
在運行時獲取泛型信息
在運行時調用任意一個對象的成員變量和方法
在運行時處理注解
生成動態代理
Java 反射優點和缺點
優點: 可以實現動態創建對象和編譯,體現出很大的靈活性
缺點: 對性能有影響。使用反射基本上是一種解釋操作,我們可以告訴 JVM,我們希望做什么并且它滿足我們什么要求,這類操作總是慢于直接執行相同的操作
反射相關的主要 API
java.lang.Class 代表一個類
java.lang.reflect.Method 代表類的方法
java.lang.reflect.Field 代表類的成員變量
java.lang.reflect.Constructor 代表類的構造器
總結
以上是生活随笔為你收集整理的Java学习笔记7-1——注解与反射的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 初创团队可能不适合应届生小孩
- 下一篇: iptables简单应用