J???ava反射的反射法三種方法
(圖片來(lái)源網(wǎng)絡(luò )(′-ι_-`),侵刪)Java反射是種方一種強大的工具,允許程序在運行時(shí)訪(fǎng)問(wèn)、反射法檢查和操作類(lèi)和對象的種方信息,它提供了三種主要的反射法方法來(lái)實(shí)現這些功能:getDeclaredMethod(), getMethod() 和 invoke(),下面我們將詳細討論這三種方法及其用法。種??方
1. getDeclaredMethod()
getDeclaredMethod() 方法ヾ(′ω`)?用于獲取類(lèi)的反射法指定已聲明方法,包括公共、種方保護、反射法ヾ(′?`)?默認(包)(′▽?zhuān)?訪(fǎng)問(wèn)和私有方法,種方但不包括繼承的反射法方法,它的種方語(yǔ)法如下:
Method getDeclaredMethod((′▽?zhuān)?)String name, Class<?>... parameterT?ypes)
name?? 是要獲取的方法的名稱(chēng),parameterTypes 是反射法方法的參數類(lèi)型,如果方法沒(méi)有參數,種方可以傳遞一個(gè)空的(′?_?`)反射法參數數組。
示例代碼:
import java.lang.reflect.Method;pub??lic class Test { public static void main(String[] args) { try { // 獲取 Test 類(lèi)的名為 "myMethod" 的方法 Method method = Test.c(???)lass.getDeclaredMethod("myMethod", String.class); System.out.println("Method: " + method); } catch (NoSuchMethodException e) { e.printS??tackTrace(); } } private static void myMethod(Strinヽ(′?`)ノg message) { System.out.println("Message: " + message); }}2. ge??tMethod()
getMethod() 方法用于獲取類(lèi)的指定公共方法,包括公共、保護和默認(包)訪(fǎng)問(wèn)方法,但不包括私有方???法和繼承的方法,它的語(yǔ)法與 getDeclaredMethod() 相同。
示例代碼:
import java.lang.reflect.Method;public class Test { public static void main(String[] arg??s) { try { // 獲取 Test 類(lèi)的名為 "myPublicMethod" 的方法 Method method = Test.class.getMethod("myPublicMethod", String.class); System.out.println("Method: " + method); } catch (NoSuchMethodException e) { e.printSta??ckTra(′?_?`)ce(); } } public static void myPublicMethod(String message) { System.out.println("Message: " + message); }}3. invoke()
invoke() 方法用于調用通過(guò) getDeclaredMethod() 或 getMethod() 獲取到的方法,它的語(yǔ)法(fa)如下:
Object invoke(Object obj, Object... args)
obj 是要調用方法的對象實(shí)例,args 是要傳遞給方法的參數,如果方法是靜態(tài)的,可以將 obj 設置為 null。
示例代碼ヾ(′▽?zhuān)??:
import java.lang.reflect.Method;pub(╯°□°)╯lic class Test { public static void main(String[] args) { try { // 獲取ヽ(′▽?zhuān)?/ Test 類(lèi)的名為 "myMethod" 的方法 Method method = Test.??class.getDeclaredMethod("myMethod", String.cla??ss); // 創(chuàng )建 Tes(′?ω?`)t 類(lèi)的實(shí)例 Test testInstance = new Test(); // 調用 myMe??thod 方法并傳遞參數 "Hello, World!" method.invoke(testInstance, "Hello, World!"); } catch (Excep??tion e) { e.??printStackTrace(); } } pri(⊙_⊙)vate static void myMethod(String message) { System.out.println("Message: "??; + message);(??-)? }}Q1: getDeclaredMethod() 和 getMethod() 有什么區(′ω`)別?
A1: getDec??l(O_O)aredMe┐(′?`)┌thod() 用于獲取類(lèi)的指定已聲明方法,包括公共、保護、默認(包)訪(fǎng)問(wèn)和私有方法,但不包括繼承的方法,而 getMethod() 用于獲取類(lèi)的指定公共方法,包括公共、保護和默認(包)訪(fǎng)問(wèn)方法,但不包括私有方法和繼承的方法。
Q2: 如何使用反射調用私有方法?
A2: 要使用反射調用私有方法,首先需要使用 getDeclaredMethod() 獲取私有方法,然后調用 setAccessible(true) 使其可( ?▽?)訪(fǎng)問(wèn),最后使用 invoke() 調用該方法,示(shi)例代碼如下(xia):
import java.lang.reflect.Method;public class Test { public static void main(String[] ar(╬?益?)gs) { try { // 獲取 Test 類(lèi)的名為 "myPrivateMethod&quoヽ(′?`)ノt; 的私有方法 Method method = Test.class.getDeclaredMethod("(/ω\);myPrivateMethod", String.c??l??ass); // 設置方法為可訪(fǎng)問(wèn) method.setAccessi??ble(??true); //(′?`*) 創(chuàng )建 Test 類(lèi)的實(shí)例 Test testInstance = new Test(); // 調用 myPrivateMethod 方法并傳遞參數 "(??ヮ?)?*:???Hello, Worlヾ(′▽?zhuān)??d!" method.invoke(testInstance, "Hello, World!"); } catch (Ex??ception e) { e.printStackTrace(); } } pr??ivate static void myPrivateMethod(String message) { System.out.println("Message: " + message); }}