JAVA反射
動態語言,是指程序在運行時可以改變其結構:新的函數可以引進,已有的函數可以被刪除等結構上的變化。比如常見的JavaScript 就是動態語言,除此之外Ruby,Python 等也屬于動態語言,而C、C++則不屬于動態語言。從反射角度說JAVA 屬于半動態語言
1 反射機制概念
(運行狀態中知道類所有的屬性和方法)
在Java 中的反射機制是指在運行狀態中,對于任意一個類都能夠知道這個類所有的屬性和方法;并且對于任意一個對象,都能夠調用它的任意一個方法;這種動態獲取信息以及動態調用對象方法的功能成為Java 語言的反射機制。
2 反射的應用場合
在Java 程序中許多對象在運行是都會出現兩種類型:編譯時類型和運行時類型。編譯時的類型由聲明對象時實用的類型來決定,運行時的類型由實際賦值給對象的類型決定。如:
Person p=new Student();
其中編譯時類型為Person,運行時類型為Student。
的編譯時類型無法獲取具體方法
程序在運行時還可能接收到外部傳入的對象,該對象的編譯時類型為Object,但是程序有需要調用該對象的運行時類型的方法。為了解決這些問題,程序需要在運行時發現對象和類的真實信息。然而,如果編譯時根本無法預知該對象和類屬于哪些類,程序只能依靠運行時信息來發現該對象和類的真實信息,此時就必須使用到反射了。
3 Java 反射API
反射API 用來生成JVM 中的類、接口或則對象的信息。
1. Class 類:反射的核心類,可以獲取類的屬性,方法等信息。
2. Field 類:Java.lang.reflec 包中的類,表示類的成員變量,可以用來獲取和設置類之中的屬性值。
3. Method 類:Java.lang.reflec 包中的類,表示類的方法,它可以用來獲取類中的方法信息或者執行方法。
4. Constructor 類:Java.lang.reflec 包中的類,表示類的構造方法。
3.1 反射使用步驟
(獲取Class 對象、調用對象方法)
1. 獲取想要操作的類的Class 對象,他是反射的核心,通過Class 對象我們可以任意調用類的方法。
2. 調用Class 類中的方法,既就是反射的使用階段。
3. 使用反射API 來操作這些信息。
3.2 獲取Class 對象的3 種方法
調用某個對象的getClass()方法
Person p=new Person();
Class clazz=p.getClass();
調用某個類的class 屬性來獲取該類對應的Class 對象
Class clazz=Person.class;
使用Class 類中的forName()靜態方法(最安全/性能最好)
Class clazz=Class.forName("類的全路徑"); (最常用)
當我們獲得了想要操作的類的Class 對象后,可以通過Class 類中的方法獲取并查看該類中的方法和屬性。
3.3 創建對象的兩種方法
Class 對象的newInstance()
1. 使用Class 對象的newInstance()方法來創建該Class 對象對應類的實例,但是這種方法要求該Class 對象對應的類有默認的空構造器。
調用Constructor 對象的newInstance()
2. 先使用Class 對象獲取指定的Constructor 對象,再調用Constructor 對象的newInstance() 方法來創建Class 對象對應類的實例,通過這種方法可以選定構造方法創建實例。
2JAVA 注解
Annotation(注解)是Java 提供的一種對元程序中元素關聯信息和元數據(metadata)的途徑和方法。Annatation(注解)是一個接口,程序可以通過反射來獲取指定程序中元素的Annotation 對象,然后通過該Annotation 對象來獲取注解中的元數據信息。
2.1 四種標準元注解
元注解的作用是負責注解其他注解。Java5.0 定義了4 個標準的meta-annotation 類型,它們被用來提供對其它annotation 類型作說明。
2.1.1 @Target 修飾的對象范圍
@Target說明了Annotation所修飾的對象范圍:Annotation可被用于packages、types(類、接口、枚舉、Annotation 類型)、類型成員(方法、構造方法、成員變量、枚舉值)、方法參數和本地變量(如循環變量、catch 參數)。在Annotation 類型的聲明中使用了target 可更加明晰其修飾的目標
2.1.2 @Retention 定義被保留的時間長短
Retention 定義了該Annotation 被保留的時間長短:表示需要在什么級別保存注解信息,用于描述注解的生命周
期(即:被描述的注解在什么范圍內有效),取值(RetentionPoicy)由:
在源文件中有效(即源文件保留)
在class 文件中有效(即class 保留)
在運行時有效(即運行時保留)
2.1.3 @Documented 描述-javadoc
@ Documented 用于描述其它類型的annotation 應該被作為被標注的程序成員的公共API,因此可以被例如javadoc 此類的工具文檔化。
2.1.4 @Inherited 闡述了某個被標注的類型是被繼承的
@Inherited 元注解是一個標記注解,@Inherited 闡述了某個被標注的類型是被繼承的。如果一個使用了@Inherited 修飾的annotation 類型被用于一個class,則這個annotation 將被用于該class 的子類。
2.2 注解處理器
如果沒有用來讀取注解的方法和工作,那么注解也就不會比注釋更有用處了。使用注解的過程中,很重要的一部分就是創建于使用注解處理器。Java SE5 擴展了反射機制的API,以幫助程序員快速的構造自定義注解處理器。
要想學習JAVA,反射和注解這些都是基本的要求,希望大家能夠喜歡,