構造函數跟建立對象的同時執行,構造函數能夠重載,若是在建類的同時沒有建立構造函數,系統會自動建立一個沒有參數的構造函數。java
經過反射建立對象函數
package wm_io; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; /*/ *在java中能夠經過如下兩種方式經過反射建立對象 *1.使用class類的newInstance() * 調用某個類的Class對象的newInstance()方法,能夠得到與Class對象對應類的實例 * 注意:使用Class類的newInstance()方法,要求與之對應的類必須提供無參的構造函數。 * * 2.使用Constructor類實現 * javalang.reflect.Constructor類 * 注意:使用Constror建立對象時,應首先得到類的Class對象,而後經過Class類得到Constructor類的實例 */ public class test2 { private String classroom; public String getClassroom() { return classroom; } public void setClassroom(String classroom) { this.classroom = classroom; } private String nameString; public String getNameString() { return nameString; } public void setNameString(String nameString) { this.nameString = nameString; } public test2(){ nameString="wm"; classroom="卓越軟件"; } public test2(String classroom,String nameString){ this.classroom=classroom; this.nameString=nameString; } public static void main(String[] args) throws InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException{ /*1.使用class類的newInstance() * 調用某個類的Class對象的newInstance()方法,能夠得到與Class對象對應類的實例 * 注意:使用Class類的newInstance()方法,要求與之對應的類必須提供無參的構造函數。 * //使用構造方法建立類的實例 test2 test2=new test2(); //經過test2得到類的Class對象 Class c = test2.getClass(); //經過調用Class對象調用newInstance()方法,建立對象test22 test2 test22 =(wm_io.test2) c.newInstance(); //經過反射建立對象,得到類的信息 String name=test22.getNameString(); System.out.println(name);*/ /* * 2.使用Constructor類實現 * javalang.reflect.Constructor類 * 注意:使用Constror建立對象時,應首先得到類的Class對象,而後經過Class類得到Constructor類的實例 * 經過有參數的構造方法建立對象時,使用Constructor * 經過無參數的構造方法建立對象時,使用class類的newInstance() */ //得到類的class對象 Class c=test2.class; //經過Class對象得到構造器對象 Constructor constructor=c.getConstructor(); //建立類的實例 test2 test2=(wm_io.test2) constructor.newInstance(); System.out.println("姓名和班級分別是:"+test2.getNameString()+test2.getClassroom()); //下面使用有參的構造方法建立對象 //得到類的構造器對象 Constructor constructor2= c.getConstructor(String.class,String.class); //建立類的實例 test2 test22=(wm_io.test2) constructor2.newInstance("wm","卓越軟件1301"); System.out.println("姓名和班級分別是:"+test22.getNameString()+test22.getClassroom()); /** * 經過反射得到類的接口 Class c2= Class.forName("wm_io.test2"); Class[] inte=c2.getInterfaces(); for(int i=0;i<inte.length;i++){ System.out.println(inte[i].getName()); }*/ /** * 經過反射得到其餘類中的父類 Class c2=Class.forName("wm_io.test2"); Class su=c2.getSuperclass(); System.out.println(su.getName());*/ /** * 經過反射調用其它類中的方法 Class c2=Class.forName("wm_io.test2"); //調用sum方法 Method method = c2.getMethod("sum"); method.invoke(c2.newInstance()); */ } }
Java反射的概念
反射含義:能夠獲取正在運行的Java對象。
二、Java反射的功能
1)能夠判斷運行時對象所屬的類
2)能夠判斷運行時對象所具備的成員變量和方法
3)經過反射甚至能夠調用到private的方法
4)生成動態代理
三、實現Java反射的類
1)Class:它表示正在運行的Java應用程序中的類和接口
2)Field:提供有關類或接口的屬性信息,以及對它的動態訪問權限
3)Constructor:提供關於類的單個構造方法的信息以及對它的訪問權限
4)Method:提供關於類或接口中某個方法信息
注意:Class類是Java反射中最重要的一個功能類,全部獲取對象的信息(包括:方法/屬性/構造方法/訪問權限)都須要它來實現this