您好,登錄后才能下訂單哦!
這篇文章主要介紹了java反射機制有什么用,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
在java開發中有一個非常重要的概念就是java反射機制,也是java的重要特征之一。反射的概念是由Smith在1982年首次提出的,主要是指程序可以訪問、檢測和修改它本身狀態或行為的一種能力,通過反射可以調用私有方法和私有屬性,大部分框架也都是運用反射原理的。java通常是先有類再有對象,有對象就可以調用方法或者屬性,java中的反射其實是通過Class對象來調用類里面的方法。
①在運行時判斷任意一個對象所屬的類;
②在運行時構造任意一個類的對象;
③在運行時判斷任意一個類所具有的成員變量和方法;
④在運行時調用任意一個對象的方法;
⑤生成動態代理。
Java的反射機制它知道類的基本結構,這種對Java類結構探知的能力,我們稱為Java類的“自審”。如eclipse中,一按點,編譯工具就會自動的把該對象能夠使用的所有的方法和屬性全部都列出來,供用戶進行選擇。這就是利用了Java反射的原理,是對我們創建對象的探知、自審。
Class 類的實例表示正在運行的 Java 應用程序中的類和接口。枚舉是一種類,注釋是一種接口。每個數組屬于被映射為 Class 對象的一個類,所有具有相同元素類型和維數的數組都共享該 Class 對象。基本的 Java 類型(boolean、byte、char、short、int、long、float 和 double)和關鍵字 void 也表示為 Class 對象。
Class 沒有公共構造方法。Class 對象是在加載類時由 Java 虛擬機以及通過調用類加載器中的 defineClass 方法自動構造的。
Person p = new Person(); //獲取class對象的方式1 // 需要依賴 Class clazz = p.getClass(); // 方式2 在編譯之前就知道要操作的class的名稱是什么 Class clacc = Person.class; Class clazz = Class.forName("com.openlab.test.Person"); Constructor[] con = clazz.getConstructors(); Method[] methods = clazz.getDeclaredMethods(); Field[] fields = clazz.getDeclaredFields(); System.out.println(con.length); System.out.println(methods.length); System.out.println(fields.length);
Constructor 提供關于類的單個構造方法的信息以及對它的訪問權限。Constructor 允許在將實參與帶有基礎構造方法的形參的 newInstance() 匹配時進行擴展轉換,但是如果發生收縮轉換,則拋出 IllegalArgumentException。
Method 提供關于類或接口上單獨某個方法(以及如何訪問該方法)的信息。所反映的方法可能是類方法或實例方法(包括抽象方法)。
Method 允許在匹配要調用的實參與基礎方法的形參時進行擴展轉換;但如果要進行收縮轉換,則會拋出 IllegalArgumentException。
Field 提供有關類或接口的單個字段的信息,以及對它的動態訪問權限。反射的字段可能是一個類(靜態)字段或實例字段。
Array 允許在執行 get 或 set 訪問操作期間進行擴展轉換,但如果將發生收縮轉換,則拋出一個 IllegalArgumentException。
通常情況下我們只能在編寫源代碼時能夠清楚的了解到對象的相關屬性和方法,常常這些方法是被固定的,程序進入編譯之后變不能更改的,但是java加入了反射機制,便可以做到編譯之后還能對程序做出更改。
package com.openlab.test; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class Test { public static void main(String[] args) { // Person p = new Person(); // //獲取class對象的方式1 // // 需要依賴 // Class clazz = p.getClass(); // // 方式2 在編譯之前就知道要操作的class的名稱是什么 // Class clacc = Person.class; // // Constructor[] con = clazz.getConstructors(); // Method[] methods = clazz.getDeclaredMethods(); // Field[] fields = clazz.getDeclaredFields(); // // System.out.println(con.length); // System.out.println(methods.length); // System.out.println(fields.length); // 方式3 常用 Class clazz; try { clazz = Class.forName("com.openlab.test.Person"); Constructor con = clazz.getDeclaredConstructor(new Class[]{String.class,int.class}); con.setAccessible(true); Person p = (Person) con.newInstance(new Object[]{"張三瘋",99}); System.out.println(p); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } // Person p = (Person) clazz.newInstance(); } }
那么為什么要使用這種方式來創建對象呢,原因很簡單,使用反射來創建對象,最直接的原因就是因為,在寫底層代碼的時候,程序員對于要創建的對象有很多的不確定性,而正常的創建對象需要知道類名,而很多使用在使用反射的創建對象時,都是只給了個泛型,所以在不確定類型的情況下創建對象是反射獨有的功能。
感謝你能夠認真閱讀完這篇文章,希望小編分享的“java反射機制有什么用”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。