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