日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

Java通过反射执行方法

發(fā)布時間:2025/3/12 java 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java通过反射执行方法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

要動態(tài)獲取一個對象方法的信息,首先需要通過下列方法之一創(chuàng)建一個 Method 類型的對象或者數(shù)組。

getMethods()getMethods(String name,Class<?> …parameterTypes)getDeclaredMethods()getDeclaredMethods(String name,Class<?>...parameterTypes)

訪問指定的構(gòu)造方法,需要根據(jù)該方法的入口參數(shù)的類型來訪問。例如,訪問一個名稱為 max,入口參數(shù)類型依次為 int 和 String 類型的方法。

下面的兩種方式均可以實現(xiàn):

objectClass.getDeclaredConstructor("max",int.class,String.class);objectClass.getDeclaredConstructor("max",new Class[]{int.class,String.class});

Method類的常用方法

靜態(tài)方法名稱說明
getName()獲取該方法的名稱
getParameterType()按照聲明順序以 Class 數(shù)組的形式返回該方法各個參數(shù)的類型
getReturnType()以 Class 對象的形式獲得該方法的返回值類型
getExceptionTypes()以 Class 數(shù)組的形式獲得該方法可能拋出的異常類型
invoke(Object obj,Object…args)利用 args 參數(shù)執(zhí)行指定對象 obj 中的該方法,返回值為 Object 類型
isVarArgs()查看該方法是否允許帶有可變數(shù)量的參數(shù),如果允許返回 true,否則返回 false
getModifiers()獲得可以解析出該方法所采用修飾符的整數(shù)

示例如何調(diào)用 Method 類的方法獲取動態(tài)類中方法的信息。

1 . 首先創(chuàng)建一個 Book類,并編寫 4 個具有不同作用域的方法。Book 類的最終代碼如下:

public class Book {// static 作用域方法static void staticMethod() {System.out.println("執(zhí)行staticMethod()方法");}// public 作用域方法public int publicMethod(int i) {System.out.println("執(zhí)行publicMethod()方法");return 100 + i;}// protected 作用域方法protected int protectedMethod(String s, int i) throws NumberFormatException {System.out.println("執(zhí)行protectedMethod()方法");return Integer.valueOf(s) + i;}// private 作用域方法private String privateMethod(String... strings) {System.out.println("執(zhí)行privateMethod()方法");StringBuffer sb = new StringBuffer();for (int i = 0; i < sb.length(); i++) {sb.append(strings[i]);}return sb.toString();} }

2)編寫測試類 Test,在該類的 main() 方法中通過反射訪問 Book類中的所有方法,并將該方法是否帶可變類型參數(shù)、入口參數(shù)類型和可能拋出的異常類型信息輸出到控制臺。

Test 類的代碼如下:

public class Test {public static void main(String[] args) {// 獲取動態(tài)類Book1Book book = new Book();Class class1 = book.getClass();// 獲取Book1類的所有方法Method[] declaredMethods = class1.getDeclaredMethods();for (int i = 0; i < declaredMethods.length; i++) {Method method = declaredMethods[i];System.out.println("方法名稱為:" + method.getName());System.out.println("方法是否帶有可變數(shù)量的參數(shù):" + method.isVarArgs());System.out.println("方法的參數(shù)類型依次為:");// 獲取所有參數(shù)類型Class[] methodType = method.getParameterTypes();for (int j = 0; j < methodType.length; j++) {System.out.println(" " + methodType[j]);}// 獲取返回值類型System.out.println("方法的返回值類型為:" + method.getReturnType());System.out.println("方法可能拋出的異常類型有:");// 獲取所有可能拋出的異常Class[] methodExceptions = method.getExceptionTypes();for (int j = 0; j < methodExceptions.length; j++) {System.out.println(" " + methodExceptions[j]);}boolean isTurn = true;while (isTurn) {try { // 如果該成員變量的訪問權(quán)限為private,則拋出異常isTurn = false;if (method.getName().equals("staticMethod")) { // 調(diào)用沒有參數(shù)的方法method.invoke(book);} else if (method.getName().equals("publicMethod")) { // 調(diào)用一個參數(shù)的方法System.out.println("publicMethod(10)的返回值為:" + method.invoke(book, 10));} else if (method.getName().equals("protectedMethod")) { // 調(diào)用兩個參數(shù)的方法System.out.println("protectedMethod(\"10\",15)的返回值為:" + method.invoke(book, "10", 15));} else if (method.getName().equals("privateMethod")) { // 調(diào)用可變數(shù)量參數(shù)的方法Object[] parameters = new Object[] { new String[] { "J", "A", "V", "A" } };System.out.println("privateMethod()的返回值為:" + method.invoke(book, parameters));}} catch (Exception e) {System.out.println("在設(shè)置成員變量值時拋出異常,下面執(zhí)行setAccessible()方法");method.setAccessible(true); // 設(shè)置為允許訪問private方法isTurn = true;}}System.out.println("=============================\n");}} }

3)運行測試類 test,程序?qū)来蝿討B(tài)訪問 Book 類中的所有方法。訪問 staticMethod() 方法的運行效果如下所示:

方法名稱為:staticMethod 方法是否帶有可變數(shù)量的參數(shù):false 方法的參數(shù)類型依次為: 方法的返回值類型為:void 方法可能拋出的異常類型有: 執(zhí)行staticMethod()方法 =============================

訪問 publicMethod() 方法的運行效果如下所示:

方法名稱為:publicMethod 方法是否帶有可變數(shù)量的參數(shù):false 方法的參數(shù)類型依次為: int 方法的返回值類型為:int 方法可能拋出的異常類型有: 執(zhí)行publicMethod()方法 publicMethod(10)的返回值為:110 =============================

訪問 protectedMethod() 方法的運行效果如下所示:

方法名稱為:protectedMethod 方法是否帶有可變數(shù)量的參數(shù):false 方法的參數(shù)類型依次為: class java.lang.String int 方法的返回值類型為:int 方法可能拋出的異常類型有: class java.lang.NumberFormatException 執(zhí)行protectedMethod()方法 protectedMethod("10",15)的返回值為:25 =============================

訪問 privateMethod() 方法的運行效果如下所示:

方法名稱為:privateMethod 方法是否帶有可變數(shù)量的參數(shù):true 方法的參數(shù)類型依次為: class java.lang.String; 方法的返回值類型為:class java.lang.String 方法可能拋出的異常類型有: 在設(shè)置成員變量值時拋出異常,下面執(zhí)行setAccessible()方法 執(zhí)行privateMethod()方法 privateMethod()的返回值為: =============================

總結(jié)

以上是生活随笔為你收集整理的Java通过反射执行方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。