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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java 中使用反射来创建对象、调用方法

發布時間:2024/4/13 java 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 中使用反射来创建对象、调用方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。