現(xiàn)三種方式)
Java是靜態(tài)語言,并且是強(qiáng)類型語言為了實(shí)現(xiàn)動態(tài)編譯Java引入了反射機(jī)制。一、什么是反射反射是框架設(shè)計(jì)的靈魂反射機(jī)制是指在程序的運(yùn)行狀態(tài)中可以構(gòu)造任意一個類的對象可以了解任意一個對象所屬的類可以了解任意一個類的成員變量和方法可以調(diào)用任意一個對象的屬性和方法。這種動態(tài)獲取程序信息以及動態(tài)調(diào)用對象的功能稱為Java語言的反射機(jī)制。反射是java實(shí)現(xiàn)動態(tài)編譯的關(guān)鍵。二、反射的特性在運(yùn)行時判斷任意一個對象所屬的類在運(yùn)行時構(gòu)造任意一個類的對象在運(yùn)行時判斷任意一個類所具有的成員變量和方法在運(yùn)行時調(diào)用任意一個對象的方法生成動態(tài)代理。三、反射的使用場景Java編碼時知道類和對象的具體信息此時直接對類和對象進(jìn)行操作即可無需反射如果編碼時不知道類或者對象的具體信息此時應(yīng)該使用反射來實(shí)現(xiàn)比如類的名稱放在XML文件中屬性和屬性值放在XML文件中需要在運(yùn)行時讀取XML文件動態(tài)獲取類的信息在編譯時根本無法知道該對象或類可能屬于哪些類程序只依靠運(yùn)行時信息來發(fā)現(xiàn)該對象和類的真實(shí)信息四、反射實(shí)現(xiàn)的三種方式第一種通過Object類的getClass方法第二種通過對象實(shí)例方法獲取對象第三種通過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()); // 第二種通過對象實(shí)例方法獲取對象 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)點(diǎn)和缺點(diǎn)優(yōu)點(diǎn)可拓展性和解耦性。反射機(jī)制極大的提高了程序的靈活性和擴(kuò)展性降低模塊的耦合性提高自身的適應(yīng)能力。靈活性動態(tài)編譯性。通過反射機(jī)制可以讓程序創(chuàng)建和控制任何類的對象無需提前硬編碼目標(biāo)類。使用反射機(jī)制能夠在運(yùn)行時構(gòu)造一個類的對象、判斷一個類所具有的成員變量和方法、調(diào)用一個對象的方法??蚣芑?。反射機(jī)制是構(gòu)建框架技術(shù)的基礎(chǔ)所在使用反射可以避免將代碼寫死在框架中。缺點(diǎn)1、性能問題。Java反射機(jī)制中包含了一些動態(tài)類型所以Java虛擬機(jī)不能夠?qū)@些動態(tài)代碼進(jìn)行優(yōu)化。因此反射操作的效率要比正常操作效率低很多。應(yīng)避免在對性能要求很高的程序或經(jīng)常被執(zhí)行的代碼中使用反射且如何使用反射決定了性能的高低。如果反射作為程序中較少運(yùn)行的部分性能將不會成為一個問題。2、安全限制。使用反射通常需要程序的運(yùn)行沒有安全方面的限制。如果一個程序?qū)Π踩蕴岢鲆髣t最好不要使用反射。程序健壯性。反射允許代碼執(zhí)行一些通常不被允許的操作所以使用反射有可能會導(dǎo)致意想不到的后果。反射代碼破壞了Java程序結(jié)構(gòu)的抽象性所以當(dāng)程序運(yùn)行的平臺發(fā)生變化的時候由于抽象的邏輯結(jié)構(gòu)不能被識別代碼產(chǎn)生的效果與之前會產(chǎn)生差異。