Java 反射篇——獲取構造方法
阿新 • • 發佈:2022-03-27
Java 反射篇——獲取構造方法
1、簡介
通過反射來獲取一個類的構造器可以分為以下兩步:
- 獲取該類的位元組碼物件(類物件 Class)
- 從這個位元組碼物件去獲取需要的構造器
2、程式碼實現
// 使用類物件 Class<?> myClass = Class.forName("com.zhang.reflect.Student"); // new Student() 無參構造方法 Object myObject = myClass.getDeclaredConstructor().newInstance(); // 獲取有引數的構造方法 Object o = myClass.getDeclaredConstructor(String.class, String.class).newInstance("張三", "Tom"); // 獲取所有的構造方法 Constructor<?>[] declaredConstructors = myClass.getDeclaredConstructors(); // 獲取類的路徑名字 System.out.println("類的全類名: " + myClass.getName()); System.out.println("類的簡單類名: " + myClass.getSimpleName());
// 獲取類物件 Class<?> myClass = Class.forName("com.zhang.reflect.Student"); // 獲取所有的構造方法 ; 結果為構造方法陣列 Constructor<?>[] constructors = myClass.getDeclaredConstructors(); // 迭代器獲取數組裡面構造方法數組裡面每一個構造方法物件 for (Constructor constructor : constructors){ System.out.println(constructor.getName()); // 構造方法的名 System.out.println(constructor.getModifiers()); // 獲取構造方法的修飾符 System.out.println(Modifier.toString(constructor.getModifiers())); // 人性化表達(預設為數字表達,對開發者不友好) // 獲取構造方法所以的引數(每一個引數也是一個物件) Parameter[] parameters = constructor.getParameters(); for (Parameter parameter : parameters){ // 獲取引數的名parameter.getName()[實際沒有] parameter.getType()獲得引數的型別返回的是一個物件,在獲取引數型別物件的名字 // String.format() 格式化輸出,第一個引數是格式化模式,後面的引數為格式化模式裡面 %s(佔位符)的個數 System.out.println(String.format("\t引數: %s %s", parameter.getType().getTypeName(),parameter.getName())); // 對程式來說引數名字沒有意義 // parameter.getName()相當於 int index = 0; System.out.println("arg" + index); index ++;(滿足你的需要) // 對於一個方法來說需要獲取的東西有: - 修飾符 - 方法名 - 引數的個數 - 每個引數型別(反射全部可以做到)
3、思考
myClass = Class.forName("cn.jxufe.test.Cat");
程式碼A:Object myObject = myClass.getDeclaredConstructor().newInstance();
程式碼B:Object myObject = myClass.newInstance();
請從個人理解的角度對程式碼A、B的異同進行評述
- 程式碼A 可以獲取有引數的構造方法也可以獲取無引數的構造方法
- 程式碼B 預設為使用無引數的構造方法
- 相同 : 都可以通過反射獲取類物件且例項化
行者不止,打之無疆