三種方式)
Java是靜態(tài)語言,并且是強類型語言為了實現(xiàn)動態(tài)編譯Java引入了反射機制。一、什么是反射反射是框架設計的靈魂反射機制是指在程序的運行狀態(tài)中可以構造任意一個類的對象可以了解任意一個對象所屬的類可以了解任意一個類的成員變量和方法可以調用任意一個對象的屬性和方法。這種動態(tài)獲取程序信息以及動態(tài)調用對象的功能稱為Java語言的反射機制。反射是java實現(xiàn)動態(tài)編譯的關鍵。二、反射的特性在運行時判斷任意一個對象所屬的類在運行時構造任意一個類的對象在運行時判斷任意一個類所具有的成員變量和方法在運行時調用任意一個對象的方法生成動態(tài)代理。三、反射的使用場景Java編碼時知道類和對象的具體信息此時直接對類和對象進行操作即可無需反射如果編碼時不知道類或者對象的具體信息此時應該使用反射來實現(xiàn)比如類的名稱放在XML文件中屬性和屬性值放在XML文件中需要在運行時讀取XML文件動態(tài)獲取類的信息在編譯時根本無法知道該對象或類可能屬于哪些類程序只依靠運行時信息來發(fā)現(xiàn)該對象和類的真實信息四、反射實現(xiàn)的三種方式第一種通過Object類的getClass方法第二種通過對象實例方法獲取對象第三種通過Class.forName方式package com.angyan.tool.tools; /** * author Evan Walker * version 1.0 * desc 昂焱數(shù)據(jù)https://www.ayshuju.com * date 2023/03/15 09:41:57 */ public class ReflectTest { public static void main(String[] args) throws Exception{ // 第一種通過類名.class Class clazz1 Dog.class; System.out.println(clazz1.getName()); // 第二種通過對象實例方法獲取對象 Dog dog new Dog(); Class? clazz2 dog.getClass(); System.out.println(clazz2.getName()); // 第三種通過Class.forName方式 Class clazz3 Class.forName(com.angyan.tool.tools.Dog); System.out.println(clazz3.getName()); } } class Dog { }PS枚舉類不能使用反射五、反射的優(yōu)點和缺點優(yōu)點可拓展性和解耦性。反射機制極大的提高了程序的靈活性和擴展性降低模塊的耦合性提高自身的適應能力。靈活性動態(tài)編譯性。通過反射機制可以讓程序創(chuàng)建和控制任何類的對象無需提前硬編碼目標類。使用反射機制能夠在運行時構造一個類的對象、判斷一個類所具有的成員變量和方法、調用一個對象的方法??蚣芑7瓷錂C制是構建框架技術的基礎所在使用反射可以避免將代碼寫死在框架中。缺點1、性能問題。Java反射機制中包含了一些動態(tài)類型所以Java虛擬機不能夠對這些動態(tài)代碼進行優(yōu)化。因此反射操作的效率要比正常操作效率低很多。應避免在對性能要求很高的程序或經(jīng)常被執(zhí)行的代碼中使用反射且如何使用反射決定了性能的高低。如果反射作為程序中較少運行的部分性能將不會成為一個問題。2、安全限制。使用反射通常需要程序的運行沒有安全方面的限制。如果一個程序對安全性提出要求則最好不要使用反射。程序健壯性。反射允許代碼執(zhí)行一些通常不被允許的操作所以使用反射有可能會導致意想不到的后果。反射代碼破壞了Java程序結構的抽象性所以當程序運行的平臺發(fā)生變化的時候由于抽象的邏輯結構不能被識別代碼產(chǎn)生的效果與之前會產(chǎn)生差異。