摘要:通過反射獲取無參構(gòu)造方法并使用得到無參構(gòu)造方法獲取所有的修飾的構(gòu)造方法。如果方法沒有返回值,返回的是反射獲取空參數(shù)成員方法并運(yùn)行代碼演示反射獲取成員方法并運(yùn)行獲取對象中的成員方法獲取的是文件中的所有公共成員方法包括繼承的類是描述
01類加載器
* A.類的加載 當(dāng)程序要使用某個類時,如果該類還未被加載到內(nèi)存中,則系統(tǒng)會通過加載,連接,初始化三步來實(shí)現(xiàn)對這個類進(jìn)行初始化。 ? * a 加載 * 就是指將class文件讀入內(nèi)存,并為之創(chuàng)建一個Class對象。 * 任何類被使用時系統(tǒng)都會建立一個Class對象 ? * b 連接 * 驗證 是否有正確的內(nèi)部結(jié)構(gòu),并和其他類協(xié)調(diào)一致 * 準(zhǔn)備 負(fù)責(zé)為類的靜態(tài)成員分配內(nèi)存,并設(shè)置默認(rèn)初始化值 * 解析 將類的二進(jìn)制數(shù)據(jù)中的符號引用替換為直接引用 ? * c 初始化 * 就是我們以前講過的初始化步驟(new 對象) * 注:簡單的說就是:把.class文件加載到內(nèi)存里,并把這個.class文件封裝成一個Class類型的對象。 * B.類的加載時機(jī) 以下的情況,會加載這個類。 * a. 創(chuàng)建類的實(shí)例 * b. 類的靜態(tài)變量,或者為靜態(tài)變量賦值 * c. 類的靜態(tài)方法 * d. 使用反射方式來強(qiáng)制創(chuàng)建某個類或接口對應(yīng)的java.lang.Class對象 * e. 初始化某個類的子類 * f. 直接使用java.exe命令來運(yùn)行某個主類 * C: 類加載器(了解) 負(fù)責(zé)將.class文件加載到內(nèi)在中,并為之生成對應(yīng)的Class對象。 * a. Bootstrap ClassLoader 根類加載器 * 也被稱為引導(dǎo)類加載器,負(fù)責(zé)Java核心類的加載 * 比如System,String等。在JDK中JRE的lib目錄下rt.jar文件中
? * b. Extension ClassLoader 擴(kuò)展類加載器
* 負(fù)責(zé)JRE的擴(kuò)展目錄中jar包的加載。 * 在JDK中JRE的lib目錄下ext目錄
? * c. System ClassLoader 系統(tǒng)類加載器
* 負(fù)責(zé)在JVM啟動時加載來自java命令的class文件,以及classpath環(huán)境變量所指定的jar包和類路徑。 * 我們用的是System ClassLoader 系統(tǒng)類加載器02反射
* A. 反射定義 * a. JAVA反射機(jī)制是在運(yùn)行狀態(tài)中, 對于任意一個類,都能夠知道這個類的所有屬性和方法; 對于任意一個對象,都能夠調(diào)用它的任意一個方法和屬性; 這種動態(tài)獲取的信息以及動態(tài)調(diào)用對象的方法的功能稱為java語言的反射機(jī)制。 * b.反射技術(shù) 條件:運(yùn)行狀態(tài) 已知:一個類或一個對象(根本是已知.class文件) 結(jié)果:得到這個類或?qū)ο蟮乃蟹椒ê蛯傩? * 注: 要想解剖一個類,必須先要獲取到該類的字節(jié)碼文件對象。而解剖使用的就是Class類中的方法.所以先要獲取到每一個字節(jié)碼文件對應(yīng)的Class類型的對象。 * B. Class類 * a. Class類及Class對象的了解 要想解剖一個類,必須先了解Class對象。 閱讀API的Class類得知,Class 沒有公共構(gòu)造方法。Class 對象是在加載類時由 Java 虛擬機(jī)以及通過調(diào)用類加載器中的 defineClass 方法自動構(gòu)造的。 * b. 得到Class對象 * 1. 有三個方法 方式一: 通過Object類中的getClass()方法 Person person = new Person(); Class clazz = person.getClass(); 方式二: 通過 類名.class 獲取到字節(jié)碼文件對象(任意數(shù)據(jù)類型都具備一個class靜態(tài)屬性,看上去要比第一種方式簡單)。 Class clazz = Person.class; 方式三: 通過Class類中的方法(將類名作為字符串傳遞給Class類中的靜態(tài)方法forName即可)。 Class c3 = Class.forName("Person"); 注:第三種和前兩種的區(qū)別是: 前兩種你必須明確Person類型. 后面是指定這種類型的字符串就行.這種擴(kuò)展更強(qiáng).我不需要知道你的類.我只提供字符串,按照配置文件加載就可以了 * 2. 得到Class對象的三個方法代碼演示: ? 代碼演示 /* * 獲取.class字節(jié)碼文件對象的方式 * 1:通過Object類中的getObject()方法 * 2: 通過 類名.class 獲取到字節(jié)碼文件對象 * 3: 反射中的方法, * public static Class> forName(String className) throws ClassNotFoundException * 返回與帶有給定字符串名的類或接口相關(guān)聯(lián)的 Class 對象 */ public class ReflectDemo { public static void main(String[] args) throws ClassNotFoundException { // 1: 通過Object類中的getObject()方法 // Person p1 = new Person(); // Class c1 = p1.getClass(); // System.out.println("c1 = "+ c1); // 2: 通過 類名.class 獲取到字節(jié)碼文件對象 // Class c2 = Person.class; // System.out.println("c2 = "+ c2); // 3: 反射中的方法 Class c3 = Class.forName("cn.itcast_01_Reflect.Person");// 包名.類名 System.out.println("c3 = " + c3); } }
? Person類
package cn.itcast_01_Reflect; public class Person { //成員變量 public String name; public int age; private String address; //構(gòu)造方法 public Person() { System.out.println("空參數(shù)構(gòu)造方法"); } public Person(String name) { this.name = name; System.out.println("帶有String的構(gòu)造方法"); } //私有的構(gòu)造方法 private Person(String name, int age){ this.name = name; this.age = age; System.out.println("帶有String,int的構(gòu)造方法"); } public Person(String name, int age, String address){ this.name = name; this.age = age; this.address = address; System.out.println("帶有String, int, String的構(gòu)造方法"); } //成員方法 //沒有返回值沒有參數(shù)的方法 public void method1(){ System.out.println("沒有返回值沒有參數(shù)的方法"); } //沒有返回值,有參數(shù)的方法 public void method2(String name){ System.out.println("沒有返回值,有參數(shù)的方法 name= "+ name); } //有返回值,沒有參數(shù) public int method3(){ System.out.println("有返回值,沒有參數(shù)的方法"); return 123; } //有返回值,有參數(shù)的方法 public String method4(String name){ System.out.println("有返回值,有參數(shù)的方法"); return "哈哈" + name; } //私有方法 private void method5(){ System.out.println("私有方法"); } @Override public String toString() { return "Person [name=" + name + ", age=" + age + ", address=" + address+ "]"; } } * 注: Class類型的唯一性 因為一個.class文件在內(nèi)存里只生成一個Class對象,所以無論那一種方法得到Class對象,得到的都是同一個對象。 * C.通過反射獲取無參構(gòu)造方法并使用 * a. 得到無參構(gòu)造方法 public Constructor>[] getConstructors() 獲取所有的public 修飾的構(gòu)造方法。 選擇無參構(gòu)造方法,不建議使用。 public Constructor3總結(jié)getConstructor(Class>... parameterTypes) 獲取public修飾, 指定參數(shù)類型所對應(yīng)的構(gòu)造方法。 不傳參數(shù)得到無參構(gòu)造方法。 * b. 運(yùn)行無參構(gòu)造方法 public T newInstance(Object... initargs) 使用此 Constructor 對象表示的構(gòu)造方法來創(chuàng)建該構(gòu)造方法的聲明類的新實(shí)例,并用指定的初始化參數(shù)初始化該實(shí)例。 因為是無參構(gòu)造,所以不傳參數(shù)。 * c. 通過反射獲取無參構(gòu)造方法并使用的代碼演示: package cn.itcast.demo1; import java.lang.reflect.Constructor; /* * 通過反射獲取class文件中的構(gòu)造方法,運(yùn)行構(gòu)造方法 * 運(yùn)行構(gòu)造方法,創(chuàng)建對象 * 獲取class文件對象 * 從class文件對象中,獲取需要的成員 * * Constructor 描述構(gòu)造方法對象類 */ public class ReflectDemo1 { public static void main(String[] args) throws Exception { Class c = Class.forName("cn.itcast.demo1.Person"); //使用class文件對象,獲取類中的構(gòu)造方法 // Constructor[] getConstructors() 獲取class文件對象中的所有公共的構(gòu)造方法 /*Constructor[] cons = c.getConstructors(); for(Constructor con : cons){ System.out.println(con); }*/ //獲取指定的構(gòu)造方法,空參數(shù)的構(gòu)造方法 Constructor con = c.getConstructor(); //運(yùn)行空參數(shù)構(gòu)造方法,Constructor類方法 newInstance()運(yùn)行獲取到的構(gòu)造方法 Object obj = con.newInstance(); System.out.println(obj.toString()); } } * D. 通過反射獲取有參構(gòu)造方法并使用 * a. 得到有參的構(gòu)造方法 public Constructor getConstructor(Class>... parameterTypes) 獲取public修飾, 指定參數(shù)類型所對應(yīng)的構(gòu)造方法。 傳相應(yīng)的參數(shù)類型得到有參構(gòu)造方法。 * b. 運(yùn)行無參構(gòu)造方法 public T newInstance(Object... initargs) 使用此 Constructor 對象表示的構(gòu)造方法來創(chuàng)建該構(gòu)造方法的聲明類的新實(shí)例,并用指定的初始化參數(shù)初始化該實(shí)例。 因為是有參構(gòu)造,所以傳相應(yīng)的參數(shù)值。 * c. 通過反射獲取有參構(gòu)造方法并使用的代碼演示: package cn.itcast.demo1; import java.lang.reflect.Constructor; /* * 通過反射,獲取有參數(shù)的構(gòu)造方法并運(yùn)行 * 方法getConstructor,傳遞可以構(gòu)造方法相對應(yīng)的參數(shù)列表即可 */ public class ReflectDemo2 { public static void main(String[] args)throws Exception { Class c = Class.forName("cn.itcast.demo1.Person"); //獲取帶有,String和int參數(shù)的構(gòu)造方法 //Constructor getConstructor(Class>... parameterTypes) //Class>... parameterTypes 傳遞要獲取的構(gòu)造方法的參數(shù)列表 Constructor con = c.getConstructor(String.class,int.class); //運(yùn)行構(gòu)造方法 // T newInstance(Object... initargs) //Object... initargs 運(yùn)行構(gòu)造方法后,傳遞的實(shí)際參數(shù) Object obj = con.newInstance("張三",20); System.out.println(obj); } } * E. 通過反射獲取有參構(gòu)造方法并使用快捷方式 * a. 使用的前提 類有空參的公共構(gòu)造方法。(如果是同包,默認(rèn)權(quán)限也可以) * b. 使用的基礎(chǔ) Class類的 public T newInstance() 方法 創(chuàng)建此 Class 對象所表示的類的一個新實(shí)例。 * c. 通過反射獲取有參構(gòu)造方法并使用快捷方式的代碼演示: package cn.itcast.demo1; /* * 反射獲取構(gòu)造方法并運(yùn)行,有快捷點(diǎn)的方式 * 有前提: * 被反射的類,必須具有空參數(shù)構(gòu)造方法 * 構(gòu)造方法權(quán)限必須public */ public class ReflectDemo3 { public static void main(String[] args) throws Exception { Class c = Class.forName("cn.itcast.demo1.Person"); // Class類中定義方法, T newInstance() 直接創(chuàng)建被反射類的對象實(shí)例 Object obj = c.newInstance(); System.out.println(obj); } } * F. 通過反射獲取私有構(gòu)造方法并使用 * a. 得到私有的構(gòu)造方法 public Constructor getDeclaredConstructor(Class>... parameterTypes) 獲取指定參數(shù)類型所對應(yīng)的構(gòu)造方法(包含私有的)。 public Constructor>[] getDeclaredConstructors() 獲取所有的構(gòu)造方法(包含私有的)。 * b. 運(yùn)行私有構(gòu)造方法 public void setAccessible(boolean flag) 將此對象的 accessible 標(biāo)志設(shè)置為指示的布爾值。 設(shè)置為true,這個方法保證我們得到的私有構(gòu)造方法的運(yùn)行。(取消運(yùn)行時期的權(quán)限檢查。) public T newInstance(Object... initargs) 使用此 Constructor 對象表示的構(gòu)造方法來創(chuàng)建該構(gòu)造方法的聲明類的新實(shí)例,并用指定的初始化參數(shù)初始化該實(shí)例。 * c. 通過反射獲取私有構(gòu)造方法并使用的代碼演示: package cn.itcast.demo1; import java.lang.reflect.Constructor; /* * 反射獲取私有的構(gòu)造方法運(yùn)行 * 不推薦,破壞了程序的封裝性,安全性 * 暴力反射 */ public class ReflectDemo4 { public static void main(String[] args) throws Exception{ Class c = Class.forName("cn.itcast.demo1.Person"); //Constructor[] getDeclaredConstructors()獲取所有的構(gòu)造方法,包括私有的 /*Constructor[] cons = c.getDeclaredConstructors(); for(Constructor con : cons){ System.out.println(con); }*/ //Constructor getDeclaredConstructor(Class...c)獲取到指定參數(shù)列表的構(gòu)造方法 Constructor con = c.getDeclaredConstructor(int.class,String.class); //Constructor類,父類AccessibleObject,定義方法setAccessible(boolean b) con.setAccessible(true); Object obj = con.newInstance(18,"lisi"); System.out.println(obj); } } * 注:不推薦,破壞了程序的封裝性,安全性。 * G. 反射獲取成員變量并改值 * a. 獲取成員變量 * 得到公共的成員變量 public Field getField(String name) 返回一個 Field 對象,它反映此 Class 對象所表示的類或接口的指定公共成員字段。 public Field[] getFields() 返回一個包含某些 Field 對象的數(shù)組,這些對象反映此 Class 對象所表示的類或接口的所有可訪問公共字段。 * 得到所有的成員變量(包括私有的,如果要進(jìn)行修改私有成員變量,要先進(jìn)行public void setAccessible(boolean flag) 設(shè)置。) public Field getDeclaredField(String name) 返回一個 Field 對象,該對象反映此 Class 對象所表示的類或接口的指定已聲明字段。 public Field[] getDeclaredFields() 返回 Field 對象的一個數(shù)組,這些對象反映此 Class 對象所表示的類或接口所聲明的所有字段。 * b. 修改成員變量(Field)的值 * 修改公共的成員變量 public void set(Object obj, Object value) 將指定對象變量上此 Field 對象表示的字段設(shè)置為指定的新值。 obj指的是修改的是那個對象的這個成員變量值。 * c. 反射獲取成員變量并改值的代碼演示 package cn.itcast.demo1; import java.lang.reflect.Field; /* * 反射獲取成員變量,并修改值 * Person類中的成員String name */ public class ReflectDemo5 { public static void main(String[] args) throws Exception{ Class c = Class.forName("cn.itcast.demo1.Person"); Object obj = c.newInstance(); //獲取成員變量 Class類的方法 getFields() class文件中的所有公共的成員變量 //返回值是Field[] Field類描述成員變量對象的類 /*Field[] fields = c.getFields(); for(Field f : fields){ System.out.println(f); }*/ //獲取指定的成員變量 String name //Class類的方法 Field getField(傳遞字符串類型的變量名) 獲取指定的成員變量 Field field = c.getField("name"); //Field類的方法 void set(Object obj, Object value) ,修改成員變量的值 //Object obj 必須有對象的支持, Object value 修改后的值 field.set(obj,"王五"); System.out.println(obj); } } * H. 反射獲取空參數(shù)成員方法并運(yùn)行 * a. 獲取空參數(shù)成員方法 * 得到公共的成員方法 public Method getMethod(String name, Class>... parameterTypes) 返回一個 Method 對象,它反映此 Class 對象所表示的類或接口的指定公共成員方法。 public Method[] getMethods() 返回一個包含某些 Method 對象的數(shù)組,這些對象反映此 Class對象所表示的類或接口(包括那些由該類或接口聲明的以及從超類和超接口繼承的那些的類或接口)的公共 member 方法。 * 得到全部的成員方法(包括私有的,如果要使用私有成員方法,要先進(jìn)行public void setAccessible(boolean flag) 設(shè)置。) public Method getDeclaredMethod(String name, Class>... parameterTypes) 返回一個 Method 對象,該對象反映此 Class 對象所表示的類或接口的指定已聲明方法。 public Method[] getDeclaredMethods() 返回 Method 對象的一個數(shù)組,這些對象反映此 Class 對象表示的類或接口聲明的所有方法,包括公共、保護(hù)、默認(rèn)(包)訪問和私有方法,但不包括繼承的方法。 * b. 使用Method方法對象 public Object invoke(Object obj, Object... args) 對帶有指定參數(shù)的指定對象調(diào)用由此 Method 對象表示的底層方法。 obj 指的是調(diào)這個方法的對象。 args 指的是調(diào)用這個方法所要用到的參數(shù)列表。 返回值Object就是方法的返回對象。如果方法沒有返回值 ,返回的是null. * c. 反射獲取空參數(shù)成員方法并運(yùn)行代碼演示 package cn.itcast.demo1; import java.lang.reflect.Method; /* * 反射獲取成員方法并運(yùn)行 * public void eat(){} */ public class ReflectDemo6 { public static void main(String[] args) throws Exception{ Class c = Class.forName("cn.itcast.demo1.Person"); Object obj = c.newInstance(); //獲取class對象中的成員方法 // Method[] getMethods()獲取的是class文件中的所有公共成員方法,包括繼承的 // Method類是描述成員方法的對象 /*Method[] methods = c.getMethods(); for(Method m : methods){ System.out.println(m); }*/ //獲取指定的方法eat運(yùn)行 // Method getMethod(String methodName,Class...c) // methodName獲取的方法名 c 方法的參數(shù)列表 Method method = c.getMethod("eat"); //使用Method類中的方法,運(yùn)行獲取到的方法eat //Object invoke(Object obj, Object...o) method.invoke(obj); } } * I. 反射獲取有參數(shù)成員方法并運(yùn)行 * a. 獲取有參數(shù)成員方法 * 得到公共的成員方法 public Method getMethod(String name, Class>... parameterTypes) 返回一個 Method 對象,它反映此 Class 對象所表示的類或接口的指定公共成員方法。 public Method[] getMethods() 返回一個包含某些 Method 對象的數(shù)組,這些對象反映此 Class對象所表示的類或接口(包括那些由該類或接口聲明的以及從超類和超接口繼承的那些的類或接口)的公共 member 方法。 * 得到全部的成員方法(包括私有的,如果要使用私有成員方法,要先進(jìn)行public void setAccessible(boolean flag) 設(shè)置。) public Method getDeclaredMethod(String name, Class>... parameterTypes) 返回一個 Method 對象,該對象反映此 Class 對象所表示的類或接口的指定已聲明方法。 public Method[] getDeclaredMethods() 返回 Method 對象的一個數(shù)組,這些對象反映此 Class 對象表示的類或接口聲明的所有方法,包括公共、保護(hù)、默認(rèn)(包)訪問和私有方法,但不包括繼承的方法。 * b. 使用Method方法對象 public Object invoke(Object obj, Object... args) 對帶有指定參數(shù)的指定對象調(diào)用由此 Method 對象表示的底層方法。 obj 指的是調(diào)這個方法的對象。 args 指的是調(diào)用這個方法所要用到的參數(shù)列表。 返回值Object就是方法的返回對象。如果方法沒有返回值 ,返回的是null. * c. 反射獲取有參數(shù)成員方法并運(yùn)行代碼演示 package cn.itcast.demo1; import java.lang.reflect.Method; /* * 反射獲取有參數(shù)的成員方法并執(zhí)行 * public void sleep(String,int,double){} */ public class ReflectDemo7 { public static void main(String[] args) throws Exception{ Class c = Class.forName("cn.itcast.demo1.Person"); Object obj = c.newInstance(); //調(diào)用Class類的方法getMethod獲取指定的方法sleep Method method = c.getMethod("sleep", String.class,int.class,double.class); //調(diào)用Method類的方法invoke運(yùn)行sleep方法 method.invoke(obj, "休眠",100,888.99); } } * J. 反射泛型擦除 * a. 使用情況 例如:在泛型為String的集合里,添加Integer的數(shù)據(jù) ArrayList list = new ArrayList (); list.add(100); * b. 能用泛型擦除的理論 偽泛型:在編譯后的.class文件里面是沒有泛型的。類型為Object。 用反射的方法繞過編譯,得到Class文件對象,直接調(diào)用add方法。 * c. 反射泛型擦除的代碼演示 package cn.itcast.demo2; import java.lang.reflect.Method; import java.util.ArrayList; /* * 定義集合類,泛型String * 要求向集合中添加Integer類型 * * 反射方式,獲取出集合ArrayList類的class文件對象 * 通過class文件對象,調(diào)用add方法 * * 對反射調(diào)用方法是否理解 */ public class ReflectTest { public static void main(String[] args)throws Exception { ArrayList array = new ArrayList (); array.add("a"); //反射方式,獲取出集合ArrayList類的class文件對象 Class c = array.getClass(); //獲取ArrayList.class文件中的方法add Method method = c.getMethod("add",Object.class); //使用invoke運(yùn)行ArrayList方法add method.invoke(array, 150); method.invoke(array, 1500); method.invoke(array, 15000); System.out.println(array); } } * K. 反射通過配置文件來決定運(yùn)行的步驟 * a. 操作依據(jù) 通過配置文件得到類名和要運(yùn)行的方法名,用反射的操作類名得到對象和調(diào)用方法 * b. 實(shí)現(xiàn)步驟: * 1. 準(zhǔn)備配置文件,鍵值對 * 2. IO流讀取配置文件 Reader * 3. 文件中的鍵值對存儲到集合中 Properties * 集合保存的鍵值對,就是類名和方法名 * 4. 反射獲取指定類的class文件對象 * 5. class文件對象,獲取指定的方法 * 6. 運(yùn)行方法 * c. 代碼演示 代碼: package cn.itcast.demo3; import java.io.FileReader; import java.lang.reflect.Method; import java.util.Properties; /* * 調(diào)用Person方法,調(diào)用Student方法,調(diào)用Worker方法 * 類不清楚,方法也不清楚 * 通過配置文件實(shí)現(xiàn)此功能 * 運(yùn)行的類名和方法名字,以鍵值對的形式,寫在文本中 * 運(yùn)行哪個類,讀取配置文件即可 * 實(shí)現(xiàn)步驟: * 1. 準(zhǔn)備配置文件,鍵值對 * 2. IO流讀取配置文件 Reader * 3. 文件中的鍵值對存儲到集合中 Properties * 集合保存的鍵值對,就是類名和方法名 * 4. 反射獲取指定類的class文件對象 * 5. class文件對象,獲取指定的方法 * 6. 運(yùn)行方法 */ public class Test { public static void main(String[] args) throws Exception{ //IO流讀取配置文件 FileReader r = new FileReader("config.properties"); //創(chuàng)建集合對象 Properties pro = new Properties(); //調(diào)用集合方法load,傳遞流對象 pro.load(r); r.close(); //通過鍵獲取值 String className = pro.getProperty("className"); String methodName = pro.getProperty("methodName"); //反射獲取指定類的class文件對象 Class c = Class.forName(className); Object obj = c.newInstance(); //獲取指定的方法名 Method method = c.getMethod(methodName); method.invoke(obj); } } 配置文件: #className=cn.itcast.demo3.Student #methodName=study className=cn.itcast.demo3.Person methodName=eat #className=cn.itcast.demo3.Worker #methodName=job
把今天的知識點(diǎn)總結(jié)一遍。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/67178.html
摘要:反射學(xué)習(xí)的靈魂我們從最初的,到面向?qū)ο蟛糠?,我們可以將代碼在計算機(jī)中經(jīng)歷的階段分為三部分源代碼階段類對象階段運(yùn)行時階段而我們知道,中一個類在源代碼階段,是存儲在硬盤中的,而編譯后,就已經(jīng)被加載到內(nèi)存中區(qū),那么有沒有一種方法可以在這種情況下 反射:Web學(xué)習(xí)的靈魂 我們從最初的 javac -HelloWorld.java,到面向?qū)ο蟛糠?,我們可以將Java代碼在計算機(jī)中經(jīng)歷的階段分為三...
摘要:通過反射獲取帶參無返回值成員方法并使用設(shè)置安全檢查,訪問私有構(gòu)造函數(shù)必須創(chuàng)建實(shí)例這種不行,注意和方法需要傳遞參數(shù)測試復(fù)制這個功能獲取私有方法,同樣注意和的區(qū)別賦予訪問權(quán)限調(diào)用方法。 反射 目錄介紹 1.反射概述 1.1 反射概述 1.2 獲取class文件對象的三種方式 1.3 反射常用的方法介紹 1.4 反射的定義 1.5 反射的組成 1.6 反射的作用有哪些 2.反射的...
摘要:反射的使用通過反射獲取構(gòu)造方法并使用首先我們聲明一個類方便我們進(jìn)行介紹默認(rèn)的構(gòu)造方法默認(rèn)的構(gòu)造方法無參構(gòu)造方法調(diào)用了公有無參構(gòu)造方法執(zhí)行了。。。 1.概述 1.1 什么是反射 java反射機(jī)制是指在運(yùn)行狀態(tài)中,對于任意一個類,都能夠知道這個類的所有屬性和方法,對于任意一個對象,都能調(diào)用它的任意一個方法和屬性,這種動態(tài)獲取的信息以及動態(tài)調(diào)用對象的方法的功能稱為java語言的反射機(jī)制。 1...
摘要:分類根類加載器也被稱為引導(dǎo)類加載器,負(fù)責(zé)核心類的加載比如等。要想解剖一個類必須先要獲取到該類的字節(jié)碼文件對象。 這是劉意老師的JAVA基礎(chǔ)教程的筆記講的賊好,附上傳送門 傳智風(fēng)清揚(yáng)-超全面的Java基礎(chǔ) 一、類的加載 1.類初始化的時機(jī) 創(chuàng)建類的實(shí)例訪問類的靜態(tài)變量,或者為靜態(tài)變量賦值調(diào)用類的靜態(tài)方法使用反射方式來強(qiáng)制創(chuàng)建某個類或接口對應(yīng)的java.lang.Class對象初始化某個類...
閱讀 3121·2021-11-24 09:39
閱讀 981·2021-09-07 10:20
閱讀 2402·2021-08-23 09:45
閱讀 2278·2021-08-05 10:00
閱讀 579·2019-08-29 16:36
閱讀 842·2019-08-29 11:12
閱讀 2826·2019-08-26 11:34
閱讀 1847·2019-08-26 10:56