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