Java 中使用反射来创建对象、调用方法
生活随笔
收集整理的這篇文章主要介紹了
Java 中使用反射来创建对象、调用方法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Java 中使用反射來創建對象、調用方法
- 反射創建對象
- 反射調用方法
- 反射調用私有方法
- 反射調用可變參私有方法
- 反射調用的方法自身可以拋出異常的情形
??假設已有下面的類:
import java.lang.reflect.InvocationTargetException;public class Test {public Test() {}public Test(A paraA, B paraB) {System.out.println("構造器 Test(A paraA, B paraB) 被調用。");System.out.println(" > paraA:" + paraA);System.out.println(" > paraB:" + paraB);System.out.println("");}public void fun(A paraA, B paraB) {System.out.println("函數 fun(A paraA, B paraB) 被調用。");System.out.println(" > paraA:" + paraA);System.out.println(" > paraB:" + paraB);System.out.println("");} }private void privateFun(A paraA, B paraB) {System.out.println("函數 privateFun(A paraA, B paraB) 被調用。");System.out.println(" > paraA:" + paraA);System.out.println(" > paraB:" + paraB);System.out.println("");}public static void main(String[] args) {/*** 此處代碼將于下面分節補充*/}class A {private String info;public A() {}public A(String str) {this.info = str;}@Overridepublic String toString() {return this.info;} }class B {private String info;public B() {}public B(String str) {this.info = str;}@Overridepublic String toString() {return this.info;} }反射創建對象
??創建上述 Test 對象的辦法是:
public static void main(String[] args)throws NoSuchMethodException, IllegalAccessException,InvocationTargetException, InstantiationException {/*** 構造器 Test(A paraA, B paraB) 被調用。* > paraA:aaaaa* > paraB:bbbbb*/A a = new A("aaaaa");B b = new B("bbbbb");Test test = Test.class.getConstructor(A.class, B.class).newInstance(a, b);}反射調用方法
??調用上述 Test 對象的方法的辦法是:
public static void main(String[] args)throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {/*** 函數 fun(A paraA, B paraB) 被調用。* > paraA:aaaaa* > paraB:bbbbb*/Test test = new Test();A a = new A("aaaaa");B b = new B("bbbbb");test.getClass().getMethod("fun", A.class, B.class).invoke(test, a, b);}反射調用私有方法
??調用上述 Test 對象的私有方法的辦法是:
public static void main(String[] args)throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {/*** 函數 privateFun(A paraA, B paraB) 被調用。* > paraA:aaaaa* > paraB:bbbbb*/Test test = new Test();A a = new A("aaaaa");B b = new B("bbbbb");var methodToBeTested = test.getClass().getDeclaredMethod("privateFun", A.class, B.class);methodToBeTested.setAccessible(true); // 如果此處的類本來就有權限調用用反射調用的方法,則此行代碼可以省略methodToBeTested.invoke(test, a, b);}反射調用可變參私有方法
??調用上述 Test 對象的可變參私有方法的辦法是:
public static void main(String[] args)throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {System.out.println("");/*** 函數 varParaFun(A... paraAs) 被調用。* > para:a11111* > para:a22222*/Test test = new Test();A aFirst = new A("a11111");A bSecond = new A("a22222");A[] paraAs = new A[]{aFirst, bSecond};// 將可變參數視為數組參數var methodToBeTested = test.getClass().getDeclaredMethod("varParaFun", A[].class);methodToBeTested.setAccessible(true); // 如果此處的類本來就有權限調用用反射調用的方法,則此行代碼可以省略// 還必須將可變參數組再封裝到一個數組中methodToBeTested.invoke(test, new Object[]{paraAs});}反射調用的方法自身可以拋出異常的情形
??如果反射調用的方法本身可以拋出異常,則當其拋出異常時,此異常會被反射“吞掉”,封裝成 InvocationTargetException 異常重新拋出。可以使用該封裝異常的方法 getTargetException 或 getCause 來獲取被吞掉的異常。例如,
try {/*** 此處為某反射調用代碼*/} catch (InvocationTargetException exception) {Throwable realException = exception.getTargetException();if (realException instanceof MyXXXException) {throw (MyXXXException) realException;} else {// TODO:可以選擇再拋出 InvocationTargetException 異常,也可以拋出自己想拋出的異常。或者做其它事情。}}總結
以上是生活随笔為你收集整理的Java 中使用反射来创建对象、调用方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机领域中,增量是什么意思?
- 下一篇: java美元兑换,(Java实现) 美元