Java通过反射执行方法
要?jiǎng)討B(tài)獲取一個(gè)對(duì)象方法的信息,首先需要通過下列方法之一創(chuàng)建一個(gè) Method 類型的對(duì)象或者數(shù)組。
getMethods()getMethods(String name,Class<?> …parameterTypes)getDeclaredMethods()getDeclaredMethods(String name,Class<?>...parameterTypes)訪問指定的構(gòu)造方法,需要根據(jù)該方法的入口參數(shù)的類型來(lái)訪問。例如,訪問一個(gè)名稱為 max,入口參數(shù)類型依次為 int 和 String 類型的方法。
下面的兩種方式均可以實(shí)現(xiàn):
objectClass.getDeclaredConstructor("max",int.class,String.class);objectClass.getDeclaredConstructor("max",new Class[]{int.class,String.class});Method類的常用方法
| getName() | 獲取該方法的名稱 |
| getParameterType() | 按照聲明順序以 Class 數(shù)組的形式返回該方法各個(gè)參數(shù)的類型 |
| getReturnType() | 以 Class 對(duì)象的形式獲得該方法的返回值類型 |
| getExceptionTypes() | 以 Class 數(shù)組的形式獲得該方法可能拋出的異常類型 |
| invoke(Object obj,Object…args) | 利用 args 參數(shù)執(zhí)行指定對(duì)象 obj 中的該方法,返回值為 Object 類型 |
| isVarArgs() | 查看該方法是否允許帶有可變數(shù)量的參數(shù),如果允許返回 true,否則返回 false |
| getModifiers() | 獲得可以解析出該方法所采用修飾符的整數(shù) |
示例如何調(diào)用 Method 類的方法獲取動(dòng)態(tài)類中方法的信息。
1 . 首先創(chuàng)建一個(gè) Book類,并編寫 4 個(gè)具有不同作用域的方法。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)編寫測(cè)試類 Test,在該類的 main() 方法中通過反射訪問 Book類中的所有方法,并將該方法是否帶可變類型參數(shù)、入口參數(shù)類型和可能拋出的異常類型信息輸出到控制臺(tái)。
Test 類的代碼如下:
public class Test {public static void main(String[] args) {// 獲取動(dòng)態(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)用一個(gè)參數(shù)的方法System.out.println("publicMethod(10)的返回值為:" + method.invoke(book, 10));} else if (method.getName().equals("protectedMethod")) { // 調(diào)用兩個(gè)參數(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è)置成員變量值時(shí)拋出異常,下面執(zhí)行setAccessible()方法");method.setAccessible(true); // 設(shè)置為允許訪問private方法isTurn = true;}}System.out.println("=============================\n");}} }3)運(yùn)行測(cè)試類 test,程序?qū)?huì)依次動(dòng)態(tài)訪問 Book 類中的所有方法。訪問 staticMethod() 方法的運(yùn)行效果如下所示:
方法名稱為:staticMethod 方法是否帶有可變數(shù)量的參數(shù):false 方法的參數(shù)類型依次為: 方法的返回值類型為:void 方法可能拋出的異常類型有: 執(zhí)行staticMethod()方法 =============================訪問 publicMethod() 方法的運(yùn)行效果如下所示:
方法名稱為:publicMethod 方法是否帶有可變數(shù)量的參數(shù):false 方法的參數(shù)類型依次為: int 方法的返回值類型為:int 方法可能拋出的異常類型有: 執(zhí)行publicMethod()方法 publicMethod(10)的返回值為:110 =============================訪問 protectedMethod() 方法的運(yùn)行效果如下所示:
方法名稱為:protectedMethod 方法是否帶有可變數(shù)量的參數(shù):false 方法的參數(shù)類型依次為: class java.lang.String int 方法的返回值類型為:int 方法可能拋出的異常類型有: class java.lang.NumberFormatException 執(zhí)行protectedMethod()方法 protectedMethod("10",15)的返回值為:25 =============================訪問 privateMethod() 方法的運(yùn)行效果如下所示:
方法名稱為:privateMethod 方法是否帶有可變數(shù)量的參數(shù):true 方法的參數(shù)類型依次為: class java.lang.String; 方法的返回值類型為:class java.lang.String 方法可能拋出的異常類型有: 在設(shè)置成員變量值時(shí)拋出異常,下面執(zhí)行setAccessible()方法 執(zhí)行privateMethod()方法 privateMethod()的返回值為: =============================總結(jié)
以上是生活随笔為你收集整理的Java通过反射执行方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ 读取单个字符
- 下一篇: Java三种随机数生成方法