1. 程式人生 > 其它 >Java 反射篇——獲取構造方法

Java 反射篇——獲取構造方法

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(&quot;cn.jxufe.test.Cat&quot;); 
程式碼A:Object myObject = myClass.getDeclaredConstructor().newInstance(); 
程式碼B:Object myObject = myClass.newInstance(); 
請從個人理解的角度對程式碼A、B的異同進行評述
  • 程式碼A 可以獲取有引數的構造方法也可以獲取無引數的構造方法
  • 程式碼B 預設為使用無引數的構造方法
  • 相同 : 都可以通過反射獲取類物件且例項化

​ 行者不止,打之無疆