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 默認為使用無參數的構造方法
- 相同 : 都可以通過反射獲取類對象且實例化
行者不止,打之無疆