java反射機制的複習
阿新 • • 發佈:2018-12-12
1、Class類是被final修飾的類不能被繼承 2、Class類的例項表示正在執行的Java應用程式中的類和介面。列舉是一種類,註釋是一種介面。每個陣列屬於被對映為Class物件的一個類,所有具有相同元素型別和維數的陣列都共享該Class物件 。基本的Java型別(boolean,byte,char,short,int,long,float和double)和關鍵字void也表示為Class物件。Class物件沒有公共構造方法。Class物件是在載入類時由Java虛擬機器以及通過呼叫類載入器中的defineClass方法自動構造的 3、通過反射獲取構造方法並使用
自己寫的練習demo
Student類
public class Student { //--------構造方法--------------- //(預設的構造方法) Student(String str) { System.out.println("預設的構造方法="+str); } //無參的構造方法 public Student(){ System.out.println("呼叫了公有,無參構造方法"); } //有一個引數的構造方法 public Student(char name){ System.out.println("姓名:"+name); } //有多個引數的構造方法 public Student(String name,int age){ System.out.println("姓名:"+name + "年齡:"+age); } //受保護的構造方法 protected Student(boolean n){ System.out.println("受保護的構造方法n = "+n); } //私有方法 private Student(int age){ System.out.println("私有的構造方法 年齡:"+age); } }
測試類
import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; public class Constructors { public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { Class class1 = Class.forName("com.sunj.test.Student"); //獲取所有共有的構造方法 System.out.println("獲取所有公有的構造方法"); Constructor [] con1=class1.getConstructors(); for (Constructor c1 : con1) { System.out.println(c1); } //獲取所有的構造方法 System.out.println("獲取所有的構造方法,不管它的修飾符是公有,預設,保護,私有"); Constructor [] con2 = class1.getDeclaredConstructors(); for (Constructor c2 : con2) { System.out.println(c2); } System.out.println("獲取公有,無參的構造方法"); Constructor con3 = class1.getConstructor(null);//返回的是該構造方法的類物件 System.out.println(con3); Object object = con3.newInstance(null);//呼叫該方法 System.out.println("獲取私有構造方法並呼叫"); Constructor con4 = class1.getDeclaredConstructor(int.class); System.out.println(con4); //呼叫構造方法 con4.setAccessible(true);//忽略掉訪問修飾符 object = con4.newInstance(22); } }
getDeclaredConstructors和getConstructors方法的區別
1、getDeclaredConstructors是獲取所有的構造方法,而getConstructor是獲取所有的公有方法
2、兩者都可以通過傳參拿到指定的構造方法,這裡的引數是構造方法的引數的型別,比如構造方法傳的String name,那麼這裡就傳的是String.class