您好,登錄后才能下訂單哦!
這篇文章運用簡單易懂的例子給大家介紹java反射的作用,代碼非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
java反射
反射是Java的特征之一,是一種間接操作目標對象的機制。
JAVA反射機制是在運行狀態中,對于任意一個實體類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調用它的任意方法和屬性;這種動態獲取信息以及動態調用對象方法的功能稱為java語言的反射機制。
Java中為什么需要反射?反射要解決什么問題?
一句話概括就是使用反射可以賦予jvm動態編譯的能力,否則類的元數據信息只能用靜態編譯的方式實現,例如熱加載,Tomcat的classloader等等都沒法支持
Java中編譯類型有兩種:
● 靜態編譯:在編譯時確定類型,綁定對象即通過。
● 動態編譯:運行時確定類型,綁定對象。動態編譯最大限度地發揮了Java的靈活性,體現了多態的應用,可以減低類之間的耦合性。
Java反射是Java被視為動態(或準動態)語言的一個關鍵性質。這個機制允許程序在運行時透過Reflection APIs取得任何一個已知名稱的class的內部信息,包括其modifiers(諸如public、static等)、superclass(例如Object)、實現之interfaces(例如Cloneable),也包括fields和methods的所有信息,并可于運行時改變fields內容或喚起methods。
Reflection可以在運行時加載、探知、使用編譯期間完全未知的classes。即Java程序可以加載一個運行時才得知名稱的class,獲取其完整構造,并生成其對象實體、或對其fields設值、或喚起其methods。
反射(reflection)允許靜態語言在運行時(runtime)檢查、修改程序的結構與行為。
在靜態語言中,使用一個變量時,必須知道它的類型。在Java中,變量的類型信息在編譯時都保存到了class文件中,這樣在運行時才能保證準確無誤;換句話說,程序在運行時的行為都是固定的。如果想在運行時改變,就需要反射這東西了。
實現Java反射機制的類都位于java.lang.reflect包中:
1、Class類:代表一個類
2、Field類:代表類的成員變量(類的屬性)
3、Method類:代表類的方法
4、Constructor類:代表類的構造方法
5、Array類:提供了動態創建數組,以及訪問數組的元素的靜態方法
使用
1、獲取Class對象的三種方式
1.1 Object ——> getClass();
1.2 任何數據類型(包括基本數據類型)都有一個“靜態”的class屬性
1.3 通過Class類的靜態方法:forName(String className)(常用)
/** * 獲取Class對象的三種方式 * 1 Object ——> getClass(); * 2 任何數據類型(包括基本數據類型)都有一個“靜態”的class屬性 * 3 通過Class類的靜態方法:forName(String className)(常用) * */ public class Fanshe { public static void main(String[] args) { //第一種方式獲取Class對象 Student stu1 = new Student();//這一new 產生一個Student對象,一個Class對象。 Class stuClass = stu1.getClass();//獲取Class對象 System.out.println(stuClass.getName()); //第二種方式獲取Class對象 Class stuClass2 = Student.class; System.out.println(stuClass == stuClass2); //判斷第一種方式獲取的Class對象和第二種方式獲取的是否是同一個 //第三種方式獲取Class對象 try { Class stuClass3 = Class.forName("fanshe.Student"); //注意此字符串必須是真實路徑,就是帶包名的類路徑,包名.類名 System.out.println(stuClass3 == stuClass2); //判斷三種方式是否獲取的是同一個Class對象 } catch (ClassNotFoundException e) { e.printStackTrace(); } System.out.println("*****************獲取公有、無參的構造方法*************"); Constructor con = clazz.getConstructor(null); //1>、因為是無參的構造方法所以類型是一個null,不寫也可以:這里需要的是一個參數的類型,切記是類型 //2>、返回的是描述這個無參構造函數的類對象。 System.out.println("*************獲取公有字段**并調用*****************"); Field f = stuClass.getField("name"); System.out.println(f); System.out.println("***************獲取私有的show4()方法******************"); m = stuClass.getDeclaredMethod("show4", int.class); System.out.println(m); m.setAccessible(true);//解除私有限定 Object result = m.invoke(obj, 20);//需要兩個參數,一個是要調用的對象(獲取有反射),一個是實參 System.out.println("返回值:" + result); } }
關于java反射的作用就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。