1. 程式人生 > >Java的高階特性反射

Java的高階特性反射

---------------------------------------- android培訓java培訓、期待與您交流! ------------------------------------

首先簡單說說什麼反射,其實就是動態的載入類,我們在寫JDBC的時候載入驅動Class.forName("xxxx"),這句話就涉及到了反射。

反射是自JAVA誕生就具備的高階特性,其強大的擴充套件能力使JAVA嚴謹死板的語法變得靈活。

但是能夠超越一些JAVA對普通類的限定,有關反射主要相關的包在java.lang.reflect中。

但是反射也有缺點,就是結構程式碼較為複雜,使人難以理解,在程式設計中應當注視上普通的實現方式。

由於反射將一個類的各種成分都對映成了相應的類和物件,所以相對普通方法來說,比較消耗資源。

為什麼要學習反射呢?

因為其強大的擴充套件性,在java開發中框架(Spring)大量應用了反射,反射是Java開發者非常有必要掌握的一門技能。

Java的反射機制主要提供了:

在執行時判斷任意一個物件的所屬的類。

在執行時判斷構造任意一個類的物件。

在執行時判斷任意一個類所具有的成員變數和方法。

在執行時呼叫任意一個物件的方法。

Class類(反射的基石)

Java中每個類都代表了一類事物,如Person類可以有張三李四的具體物件

Class是用於描述JAVA類的一個類,代表類的位元組碼例項物件

一個類被載入器載入到記憶體中,佔用一片儲存空間,在這個空間裡的內容就是類的位元組碼

這樣一個個空間可以用一類物件來表示,這些物件具備相同的型別,這個型別就是CLASS

//不同類的位元組碼是不同的,所以他們在記憶體中的內容也是不同的

java類的用於描述一類事物的共性,該類的屬性是由該類的例項物件來決定的,不同的例項物件具備不同的屬性

java程式中的各個JAVA類也屬於同一類事物,而CLASS類就是用於描述這類事物的

 Class 類描述了類的屬性資訊,如類名、訪問許可權、包名、欄位名稱列表、方法名稱列表等  

學習反射就要先搞清楚 Class 這個類  

獲取各個位元組碼對應例項物件(class型別)的方法

1.類名.class ;如:Class c1= Person.class;

2.物件.getClass();如:new Date().getClass();

3.class.forName("類名");如:Class.forName("java.lang.String");

反射時主要用第三種,因為可以將表示“類名”的字串定義一個變數

得到類的位元組方式

                1.該類的位元組碼已經載入到了記憶體中,直接找到類的位元組碼返回(如上1,2)

                2.虛擬機器中沒有該位元組碼,用類載入器載入,將該位元組碼快取起來同時返回(如3)

Class類的例項表示正在執行的JAVA應用程式中的類和介面。列舉是一種類,註釋是一種介面。

每個陣列屬於被對映為 Class 物件的一個類,所有具有相同元素型別和維數的陣列都共享該 Class 物件。

基本的 Java 型別(booleanbytecharshortintlongfloat 和 double)和關鍵字 void 也表示為 Class 物件。

Class 沒有公共構造方法。Class 物件是在載入類時由 Java 虛擬機器以及通過呼叫類載入器中的 defineClass 方法自動構造的。  

  九個預定義Class例項物件 

   (八個基本資料型別+ void )每個型別都對應了一個 Class 例項物件   

 Class c1 = void.class;  

Class 類方法  

 isPrimitive();//判斷該位元組碼是否是基本資料型別

 包裝類不屬於基本資料型別,但是可以通過 TYPE 常量獲取其基本資料型別位元組碼;

 如:Integer.TYPE 與 int.class 是同一個位元組碼物件  

陣列型別的Class例項物件判斷方法: Class.isArray()

只要是在源程式中出現的型別,都有各自 Class 例項物件,如:int[],void

----------------------------------------------------------------------  

"反射->Refelection"

 反射並不是1.5版本才出現的,始於1.0,是java最重要的高階特性之一

概念:反射就是把Java類中的各種成分對映成相應的java類

 例如:Java中一個類可以用Class類的一個物件來表示

一個類的組成部分:成員變數、方法、構造方法、包等資訊也用一個個的Java類來表示

//就像汽車是一個類,汽車中的發動機、變速箱等組成也是一個個類

 表示Java類的Class類顯然要提供一系列的方法,來獲得其中的變數、方法、構造方法、修飾符、包等資訊

這些資訊就是用相應類的例項物件來表示,這些類是: Field,Method,Constructor,Package 等

 一個類中的每一個成員都可以用相應的反射API類的例項物件來表示,通過呼叫 Class 類的方法可以得到這些例項物件

 '得到這些例項物件後該怎麼用,是學習應用反射的要點'

 例如;  

 System.exit

System.getProperties() 

 Method -->   nethodObj1  可以使用兩個 Method 物件來代表 System 類的兩個方法

 methodOjb2  //Method代表方法這個型別,其物件代表具體是哪個方法

----------------------------------------------- 

Constructor 類   代表某個類中的構造方法 

獲取某個類所有的構造方法    // []陣列,s獲取多個

 示例: Constructor[] constructor = Class.forName("java.lang.String").getConstructors();

1,獲取某一個構造方法     //可變引數

 示例: Constructor constructor = Class.forName("java.lang.String").getConstructor(StringBuffer.class); 

//獲得構造方法時要用到型別

2,建立例項物件 

 通常方式: String str = new String(new StringBuffer("abc")); 

 反射方式: String str = (String)constructor.newInstance(new StringBuffer("abc "));//實參

//呼叫方法時要用到上面相同型別的例項物件

Class.newInstance()方法:  

 ep: String obj = (String)Class.forName("java.lanng.String").newInstance();  //空參

該方法首先得到預設的無參構造方法,然後使用該構造方法建立例項物件  

 該方法在內部使用了快取機制來儲存預設構造方法的例項物件,所以會影響效能

 只有兩個類擁有newInstance()方法,分別是 Class 類和 Constructor 類

 Class類中的newInstance()方法是不帶引數的,而Constructro類中的newInstance()方法是帶引數的(Object),

 需要提供必要的引數。  在程式設計時要擇需使用  

構造方法的反射: class-->constructor-->new object 通過兩個步驟獲取該類的物件 

-----------------------------------------------------------------------------------------------

Field 類  

   Field類代表某個類中的一個成員變數, 設有一個obj物件

   Field物件不是obj具體的變數值,而是指代的是obj所屬類的哪一個變數,可以通過Field(物件).get(obj)獲取相應的變數值

    示例: Field field = obj.getClass().getField("變數名")

   field.get(obj) //通過反射獲取物件的變數值,引數是物件,意思就是獲得那個物件的那個變數的值

   步驟: 1)獲取class位元組碼  2)獲取指定的Field物件  3)獲取變數值  

"暴力反射"

    get方法只能獲取宣告為 public 的變數,對於私有變數,可以通過getDeclaredField()方法獲取 private 變數

    獲取物件後要通過 setAccessible(true)方法將該域設定為可訪問

    示例: Field field = obj.getClass().getDeclaredField(); //1)2)獲取私有file物件

   field.setAccessible(true);  //3)將private變數設定為可訪問;繼承自父類 AccessibleObject 的方法

相關推薦

Java高階特性反射和動態代理

1).反射   通過反射的方式可以獲取class物件中的屬性、方法、建構函式等,一下是例項: 2).動態代理   使用場景:       在之前的程式碼呼叫階段,我們用action呼叫service的方法實現業務即可。     由於之前在service中實現的業務可能不能夠滿足當先客戶的要求,需要我們重

黑馬程式設計師-------Java高階特性--------反射

黑馬程式設計師—–Java高階特性—–反射 一.概述 Java 反射是Java語言的一個很重要的特徵,它使得Java具體了“動態性”。 這個機制允許程式在執行時透過Reflection APIs取得任何一個已知名稱的class的內部資訊,包括其mod

Java高階特性(動態代理和反射

目錄第4天 java高階特性增強今天內容安排:1、掌握多執行緒2、掌握併發包下的佇列3、瞭解JMS4、掌握JVM技術5、掌握反射和動態代理Øjava多執行緒增強通俗來講:應用程式就是一個程序。不管是我們開發的應用程式,還是我們執行的其他的應用程式,都需要先把程式安裝在本地的硬

Java高階特性反射

---------------------------------------- android培訓、java培訓、期待與您交流! ------------------------------------ 首先簡單說說什麼反射,其實就是動態的載入類,我們在寫JD

java高階特性反射

獲取父類的泛型 java反射概述 java Reflection,java中的反射(Reflection)被認為是動態語言的關鍵,反射機制允許程式在執行期藉助Reflection API取得任何類的內部資訊。並且能直接操作任意物件的內部屬性和方法。 簡單來

Java高階特性—鎖

1).synchronized   加同步格式:     synchronized( 需要一個任意的物件(鎖) ){       程式碼塊中放操作共享資料的程式碼。     }   synchronized的缺陷    synchronized是java中的一個關鍵字,也就是說是Java語言內建的特性。   

java高階特性 (繼承)

繼承   繼承是面向物件的三大特徵之一,也是實現軟體複用的一個手段。java的繼承具有單繼承的特點(簡單理解一個兒子只能有一個爸爸),每個子類只有一個直接父類,但是一類可以有多個子類(除final型別的類)。      繼承的特點:     java的繼承通過extends 關鍵字來實現,實現繼承的類

JAVA高階特性--內部類

內部類概念 public class Outer{ class inner{ } }  特點     可以很好的實現隱藏,可以使用procted,private       可以直接訪問外部類的所有成員 ,包括私有成員.     外部內不

JAVA高階特性--自動拆箱-裝箱,列舉型別

基本資料型別轉換為引用型別物件 一個自動裝箱的例子 Integer i=10; 相當於 Integer i=new Integer(10);   一個自動拆箱的例子 Integer m=10; int n=m; 相當於n=m.intValue();  

JAVA高階特性--String/StringBuffer/Builder

String  String物件一旦建立就不能改變 是常量 需要進行大量字串操作應採用StringBuffer/StringBuilder  最終結果轉換成String物件 StringBuffer 執行緒安全的  可變字元序列 一個類似於String的字串緩衝區(字元

Java高階特性之new一個內部類

package three.day.newcharacter; class Outer {public static final int height = 20;public static int weight = 20;private int num = 100;//內建

Java高階特性之內部類

 1.   什麼是內部類(InnerClass)?         一個類中巢狀著另一個類,這樣的類就叫內部類.        語法: class outClass{ public class innerClass{ } } 2.   內部類的

Java高階特性(一)

一、static   static關鍵字經常以修飾變數、程式碼等形式和構造器、父類構造器一起出現在筆試題中,首先了解static能修飾哪些東西。   1.static變數   static變數既是在例項變數的前面加個static,一般稱為靜態變數。   靜態變數和例項變數的區別在於給類建立例項時,靜態

JAVA高階特性——二進位制儲存圖片

import java.io.*; /** * 將圖片轉為陣列,輸出成檔案,再讀取這個檔案,獲得這個陣列,還原成圖片 * @author Administrator * * */ public class Text3 { public static void main(String[

JAVA高階特性——迷你圖書管理系統(DOM4J操作儲存集合中的物件)

  要求:使用XML儲存圖書資訊,使用DOM4J操作XML,進行圖書的增刪改查。 使用技術:XML/DOM4j/集合/物件     部分實現效果如果下:  實現思路   首先需要建立一個圖書類(Book類),儲存圖書的屬性(屬性和XML檔案一致,因

java高階特性之多執行緒

java多執行緒知識點: 1、建立分執行緒的方式 2、單例模式懶漢式執行緒安全問題 3、java執行緒同步 4、java執行緒通訊 5、java的記憶體模型 認識執行緒: 每一個java程式都有一個隱含的主執行緒,即main()方法。 程式–&g

php高階特性-反射

一、什麼是反射? 它是指在PHP執行狀態中,擴充套件分析PHP程式,匯出或提取出關於類、方法、屬性、引數等的詳細資訊,包括註釋。這種動態獲取的資訊以及動態呼叫物件的方法的功能稱為反射API。 反射是操縱面向物件範型中元模型的API,其功能十分強大,可幫助我們

java高階特性與實戰專案 ——第二章:實用類 課後作業:

1.從控制檯輸入字串,字串的長度必須為是6,如果輸入的字元長度不等於6,則重新輸入。import java.util.Scanner; public class Alphabetic { public static void main(String[] args)

Java高階特性之列舉(二)

01.Enum不可以有public或者protected的構造方法,只能是private或friendly(就前面不用修飾符),這樣可以保證客戶程式碼不能新建一個Enum的例項,我們也不需要例項化Enum物件。    Enum定義的列表成員跟介面一樣都是public,sta

JAVA高階特性第一章課後習題

1.建立類Queue,代表隊列(特點:先進先出),新增add()及get()方法,並新增main()進行效果驗證。package kenhouzuoye; public class Queue { String name;//姓名 int avg;//年齡 publi