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

歡迎訪問 生活随笔!

生活随笔

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

java

Java通过反射访问构造方法

發布時間:2025/3/12 java 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java通过反射访问构造方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

為了能夠動態獲取對象構造方法的信息,首先需要通過下列方法之一創建一個 Constructor 類型的對象或者數組。

getConstructors()getConstructor(Class<?>…parameterTypes)getDeclaredConstructors()getDeclaredConstructor(Class<?>...parameterTypes)

如果是訪問指定的構造方法,需要根據該構造方法的入口參數的類型來訪問。例如,訪問一個入口參數類型依次為 int 和 String 類型的構造方法,下面的兩種方式均可以實現。

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

創建的每個 Constructor 對象表示一個構造方法,然后利用 Constructor 對象的方法操作構造方法。

Constructor類的常用方法

方法名稱說明
isVarArgs()查看該構造方法是否允許帶可變數量的參數,如果允許,返回 true,否則返回false
getParameterTypes()按照聲明順序以 Class 數組的形式獲取該構造方法各個參數的類型
getExceptionTypes()以 Class 數組的形式獲取該構造方法可能拋出的異常類型
newInstance(Object … initargs)通過該構造方法利用指定參數創建一個該類型的對象,如果未設置參數則表示采用默認無參的構造方法
setAccessiable(boolean flag)如果該構造方法的權限為 private,默認為不允許通過反射利用 netlnstance()方法創建對象。如果先執行該方法,并將入口參數設置為 true,則允許創建對象
getModifiers()獲得可以解析出該構造方法所采用修飾符的整數

通過 java.lang.reflect.Modifier 類可以解析出 getMocMers() 方法的返回值所表示的修飾符信息。在該類中提供了一系列用來解析的靜態方法,既可以查看是否被指定的修飾符修飾,還可以字符串的形式獲得所有修飾符。

Modifier類的常用方法

靜態方法名稱說明
isStatic(int mod)如果使用 static 修飾符修飾則返回 true,否則返回 false
isPublic(int mod)如果使用 public 修飾符修飾則返回 true,否則返回 false
isProtected(int mod)如果使用 protected 修飾符修飾則返回 true,否則返回 false
isPrivate(int mod)如果使用 private 修飾符修飾則返回 true,否則返回 false
isFinal(int mod)如果使用 final 修飾符修飾則返回 true,否則返回 false
toString(int mod)以字符串形式返回所有修飾符

下列代碼判斷對象 con 所代表的構造方法是否被 public 修飾,以及以字符串形式獲取該構造方法的所有修飾符。

int modifiers = con.getModifiers(); // 獲取構造方法的修飾符整數 boolean isPublic = Modifier.isPublic(modifiers); // 判斷修飾符整數是否為public string allModifiers = Modifier.toString(modifiers);

示例如何調用 Constructor 類的方法獲取構造方法的信息。

1 . 首先創建一個 Book 類表示圖書信息。在該類中聲明一個 String 型變量表示圖書名稱,兩個 int 型變量分別表示圖書編號和價格,并提供 3 個構造方法。

Book 類的最終代碼如下:

public class Book {String name; // 圖書名稱int id, price; // 圖書編號和價格// 空的構造方法private Book() {}// 帶兩個參數的構造方法protected Book(String _name, int _id) {this.name = _name;this.id = _id;}// 帶可變參數的構造方法public Book(String... strings) throws NumberFormatException {if (0 < strings.length)id = Integer.valueOf(strings[0]);if (1 < strings.length)price = Integer.valueOf(strings[1]);}// 輸出圖書信息public void print() {System.out.println("name=" + name);System.out.println("id=" + id);System.out.println("price=" + price);} }

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

Test 類的代碼如下:

public class Test {public static void main(String[] args) {// 獲取動態類BookClass book = Book.class;// 獲取Book類的所有構造方法Constructor[] declaredContructors = book.getDeclaredConstructors();// 遍歷所有構造方法for (int i = 0; i < declaredContructors.length; i++) {Constructor con = declaredContructors[i];// 判斷構造方法的參數是否可變System.out.println("查看是否允許帶可變數量的參數:" + con.isVarArgs());System.out.println("該構造方法的入口參數類型依次為:");// 獲取所有參數類型Class[] parameterTypes = con.getParameterTypes();for (int j = 0; j < parameterTypes.length; j++) {System.out.println(" " + parameterTypes[j]);}System.out.println("該構造方法可能拋出的異常類型為:");// 獲取所有可能拋出的異常類型Class[] exceptionTypes = con.getExceptionTypes();for (int j = 0; j < exceptionTypes.length; j++) {System.out.println(" " + parameterTypes[j]);}// 創建一個未實例化的Book類實例Book book1 = null;while (book1 == null) {try { // 如果該成員變量的訪問權限為private,則拋出異常if (i == 1) {// 通過執行帶兩個參數的構造方法實例化book1book1 = (Book) con.newInstance("Java 教程", 10);} else if (i == 2) {// 通過執行默認構造方法實例化book1book1 = (Book) con.newInstance();} else {// 通過執行可變數量參數的構造方法實例化book1Object[] parameters = new Object[] { new String[] { "100", "200" } };book1 = (Book) con.newInstance(parameters);}} catch (Exception e) {System.out.println("在創建對象時拋出異常,下面執行 setAccessible() 方法");con.setAccessible(true); // 設置允許訪問 private 成員}}book1.print();System.out.println("=============================\n");}} }

3 . 運行測試類 Test,當通過反射訪問默認構造方法 Book() 時,將看到如下所示的輸出。

查看是否允許帶可變數量的參數:false 該構造方法的入口參數類型依次為: 該構造方法可能拋出的異常類型為: 在創建對象時拋出異常,下面執行setAccessible()方法 name = null id = 0 price = 0 =============================

當通過反射訪問兩個參數的構造方法 Book(String_name,int_id) 時,將看到如下所示的輸出。

查看是否允許帶可變數量的參數:false 該構造方法的入口參數類型依次為: class java.lang.String int 該構造方法可能拋出的異常類型為: 在創建對象時拋出異常,下面執行setAccessible()方法 name = null id = 0 price = 0 =============================

當通過反射訪問可變參數數量的構造方法 Book(String…strings) 時,將看到如下所示的輸出。

查看是否允許帶可變數量的參數:true 該構造方法的入口參數類型依次為: class java.lang.String; 該構造方法可能拋出的異常類型為: class java.lang.String; 在創建對象時拋出異常,下面執行setAccessible()方法 name = null id = 0 price = 0 =============================

總結

以上是生活随笔為你收集整理的Java通过反射访问构造方法的全部內容,希望文章能夠幫你解決所遇到的問題。

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