Java反射(Reflection)是一種強(qiáng)大的機(jī)制,它允許程序在運(yùn)行時(shí)獲取和操作類、接口、字段和方法的信息。反射的核心原理是通過Java虛擬機(jī)(JVM)在運(yùn)行時(shí)動(dòng)態(tài)地加載類,獲取類的結(jié)構(gòu)信息,然后通過這些信息來創(chuàng)建對(duì)象、調(diào)用方法等。
反射的基本步驟如下:
加載類:通過Class.forName()
方法或ClassLoader
類的loadClass()
方法來動(dòng)態(tài)加載類。這些方法會(huì)在JVM中查找并加載指定的類文件。
獲取類信息:加載類后,可以通過Class
類的靜態(tài)方法來獲取類的信息,如類名、修飾符、父類、接口、字段、方法等。例如,clazz.getName()
返回類名,clazz.getInterfaces()
返回實(shí)現(xiàn)的接口列表。
創(chuàng)建對(duì)象:通過Class
類的newInstance()
方法(已過時(shí),不推薦使用)或Constructor
類的newInstance()
方法來創(chuàng)建類的實(shí)例。這些方法會(huì)根據(jù)類的構(gòu)造函數(shù)動(dòng)態(tài)地分配內(nèi)存,并調(diào)用構(gòu)造函數(shù)初始化對(duì)象。
訪問字段和方法:通過Field
類和Method
類的靜態(tài)方法來訪問類的字段和方法。例如,field.get(obj)
可以獲取對(duì)象的某個(gè)字段的值,method.invoke(obj, args)
可以調(diào)用對(duì)象的某個(gè)方法。需要注意的是,訪問私有字段和方法時(shí)需要使用setAccessible(true)
方法來繞過Java的訪問控制檢查。
修改字段值:通過Field
類的set()
方法來修改對(duì)象的某個(gè)字段的值。需要注意的是,修改私有字段時(shí)需要使用setAccessible(true)
方法來繞過Java的訪問控制檢查。
反射的優(yōu)點(diǎn):
反射的缺點(diǎn):