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

​ 行者不止,打之無疆


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM