public class ReflexAndClass { public static void main(String[] args) throws Exception { /** * 獲取Class對象的三種方式 * 1 Object ——> getClass(); * 2 任何數據類型(包括基本數據類型)都有一個靜態的class屬性 * 3 通過Class類的靜態方法:forName(String className)(常用) * * * 注意:在運行期間,一個類,只有一個Class對象產生。 * 三種方式常用第三種,第一種對象都有了還要反射干什么。第二種需要導入類的包,依賴太強,不導包就拋編譯錯誤。 * 一般都第三種,一個字符串可以傳入也可寫在配置文件中等多種方法。 * @throws Exception */ //第一種 getClass Student stu = new Student(); Class stuClass1 = stu.getClass(); System.out.println(stuClass1.getName()); //第二種 class屬性 Class stuClass2 = Student.class; System.out.println(stuClass2==stuClass1); //第三種 try { Class stuClass3 = Class.forName("reflex.Student");//student的路徑 System.out.println(stuClass3); } catch (ClassNotFoundException e) { e.printStackTrace(); } /**通過Class對象可以獲取某個類中的:構造方法、成員變量、成員方法;並訪問成員; * * 1.獲取構造方法: * 1).批量的方法: * public Constructor[] getConstructors():所有"公有的"構造方法 * public Constructor[] getDeclaredConstructors():獲取所有的構造方法(包括私有、受保護、默認、公有) * * 2).獲取單個的方法,並調用: * public Constructor getConstructor(Class... parameterTypes):獲取單個的"公有的"構造方法: * public Constructor getDeclaredConstructor(Class... parameterTypes):獲取"某個構造方法"可以是私有的,或受保護、默認、公有; * * 調用構造方法: * Constructor-->newInstance(Object... initargs) * 獲取私有的構造方法的時候需要使用setAccessible設置訪問權限為true才能進行構造,否則出現異常 */ Class<?> clazz = Class.forName("reflex.Student"); Constructor[] public1 = clazz.getConstructors(); System.out.println("公有構造方法"); for(Constructor con : public1){ System.out.println(con); } Constructor[] public2 = clazz.getDeclaredConstructors(); System.out.println("所有構造方法"); for(Constructor con : public2){ System.out.println(con); } Constructor con = clazz.getConstructor(null); System.out.println("公有無參:" + con); Constructor cons = clazz.getDeclaredConstructor(String.class); System.out.println("所有無參公有構造方法"+cons); Object name = clazz.getDeclaredConstructor(String.class).newInstance("chen"); Student s = new Student(); System.out.println("名稱為:" + name); //調用構造方法 Object obj = con.newInstance(); // System.out.println("obj = " + obj); // Student student = (Student)obj; } }
public class Student { //---------------構造方法------------------- //(默認的構造方法) Student(String str){ System.out.println("(默認)的構造方法 s = " + 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); } }