java.lang.reflect.Constructor
一、Constructor類是什么
Constructor是一個類,位於java.lang.reflect包下。
在Java反射中 Constructor類描述的是 類的構造方法信息,通俗來講 有一個類如下:
1 package com.testReflect; 2 public class ConstructorDemo { 3 private int num; 4 private String str; 5 6 public ConstructorDemo(){ 7 num = 2; 8 str = "xixi"; 9 } 10 11 public ConstructorDemo(int num,String str){ 12 this.num = num; 13 this.str = str; 14 } 15 16 @Override 17 public String toString() { 18 return "ConstructorDemo [num=" + num + ", str=" + str + "]"; 19 } 20 }
在Java反射中ConstructorDemo類中的構造方法ConstructorDemo()、ConstructorDemo(int num,String str)都是Constructor類的實例,這個Constructor類的實例描述了構造方法的全部信息。(包括:方法修飾符、方法名稱、參數列表 等等)
二、如何獲取Constructor類對象
一共有4種方法,全部都在Class類中:
- getConstructors():獲取類中的公共方法
- getConstructor(Class[] params): 獲取類的特定構造方法,params參數指定構造方法的參數類型
- getDeclaredConstructors(): 獲取類中所有的構造方法(public、protected、default、private)
- getDeclaredConstructor(Class[] params): 獲取類的特定構造方法,params參數指定構造方法的參數類型
三、Constructor類中常用的方法
對於構造方法,我們就是用來創建類的實例的,但是在Java反射中需要注意的是:默認構造函數和帶參數的構造方法創建實例的區別。
1 package com.testReflect; 2 3 import java.lang.reflect.Constructor; 4 import java.lang.reflect.Modifier; 5 6 public class ConstructorTest { 7 public static void main(String[] args) throws Exception { 8 //使用反射第一步:獲取操作類ConstructorDemo所對應的Class對象 9 Class<?> cls = Class.forName("com.testReflect.ConstructorDemo"); 10 11 //獲取默認的構造函數 12 Constructor constructor1 = cls.getConstructor(new Class[]{}); 13 //獲取構造函數信息 14 System.out.println("修飾符: "+Modifier.toString(constructor1.getModifiers())); 15 System.out.println("構造函數名: "+constructor1.getName()); 16 System.out.println("參數列表: "+constructor1.getParameterTypes()); 17 //通過默認的構造函數創建ConstructorDemo類的實例 18 Object obj = constructor1.newInstance(); 19 System.out.println("調用默認構造函數生成實例:"+obj.toString()); 20 21 System.out.println("==============================================="); 22 23 //獲取帶參數的構造函數 24 Constructor constructor2 = cls.getConstructor(new Class[]{int.class,String.class}); 25 System.out.println("修飾符: "+Modifier.toString(constructor2.getModifiers())); 26 System.out.println("構造函數名: "+constructor2.getName()); 27 System.out.println("參數列表: "+constructor2.getParameterTypes()); 28 //獲取構造函數信息 29 //通過帶參數的構造函數創建ConstructorDemo類的實例 30 Object obj2 = constructor2.newInstance(new Object[]{33,"haha"}); 31 System.out.println("調用帶參數構造函數生成實例:"+obj2.toString()); 32 } 33 }